在多进程使用过程中有时候需要在进程间共享缓存一些数据,比如:
- session数据
- 数据库查询缓存
- 有一定时效的信息,比如oauth使用的
access_token
常规的缓存机制需要引入第三方模块,如memcached/redis等。node-shared-cache
(链接)就是专门解决此类问题的轻量级方案。相比第三方模块,node-shared-cache
的优势有:
- 无需跨进程通讯,使用共享内存的方式,因而可以同步使用
- API简单,和操作普通js对象一样的使用方式
- 超高性能,接近普通js对象操作的速度,每秒300w次查询
- 支持持久化,进程退出后内容不会清空
使用方式
var cache = require('node-shared-cache');
var obj = new cache.Cache("test", 557056);
// setting property
obj.foo = "bar";
// getting property
console.log(obj.foo);
// enumerating properties
for(var k in obj);
Object.keys(obj);
// deleting property
delete obj.foo;
// writing objects is also supported
obj.foo = {'foo': 'bar'};
// but original object reference is not saved
var test = obj.foo = {'foo': 'bar'};
test === obj.foo; // false
// circular reference is supported.
test.self = test;
obj.foo = test;
// and saved result is also circular
test = obj.foo;
test.self === test; // true
原理
共享内存
通过共享内存而不是socket的形式进行数据共享,确保最大性能
hashmap
以hashmap形式对数据进行索引,并支持遍历
LRU
以LRU算法对cache内容进行替换,确保最大命中效率
futex
以futex实现用户态互斥锁,避免内核陷入的同时保证数据完整性
binary json
以二进制形式对js对象进行序列化/反序列化,提高效率,并支持对象循环引用
程序挂掉重启后不就没了?
同上~
@luoyjx @CommanderXL 因为是共享内存,所以会保留在物理内存上的,就像ramdisk一样,直到关机才会消失;可以通过tmpfs找到对应的文件(一般在/dev/shm/或/run/shm/中)
这个只能用于一台服务器吧,有两个节点怎么办
都是第三方模块,性能不错- 每秒300w次查询 跨Cluster是怎么实现的?
c++写的,怎么实现的跨进程共享的
@leapon @blackjack 通过共享内存实现的,多个进程打开同一个共享内存文件并分别map到自己的内存地址空间里面
@wyTrivail 设计目的就是解决单机问题的,所以强调的是高性能,可以同步访问而不需要异步回调;多节点的话可以考虑封装一个网络接口出去,不过效果可能不如直接用memcache/redis
- 不支持function传递啊
这只能用于单机,多机部署就不行了,还是不如memcache和redis
收藏,是不是可以用来做单机的进程锁?
赞啊,最近正找这方面的方案呢。
用 socket.pipe(net.connect(“other host”) ) 就可跨机器
让我想起了 openresty的 shared_dict
666
mac 10.14.1 版本。tnpm install (tnpm:淘宝封装的npm)提示 Package require os(linux) not compatible with your platform(darwin) 有的解吗?