在多进程使用过程中有时候需要在进程间共享缓存一些数据,比如:
- 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对象进行序列化/反序列化,提高效率,并支持对象循环引用
8 回复
@luoyjx @CommanderXL 因为是共享内存,所以会保留在物理内存上的,就像ramdisk一样,直到关机才会消失;可以通过tmpfs找到对应的文件(一般在/dev/shm/或/run/shm/中)