精华 node-shared-cache: 跨cluster内存共享模块
发布于 4 年前 作者 kyriosli 9253 次浏览 最后一次编辑是 3 年前 来自 分享

在多进程使用过程中有时候需要在进程间共享缓存一些数据,比如:

  • 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对象进行序列化/反序列化,提高效率,并支持对象循环引用

16 回复

程序挂掉重启后不就没了?

@luoyjx @CommanderXL 因为是共享内存,所以会保留在物理内存上的,就像ramdisk一样,直到关机才会消失;可以通过tmpfs找到对应的文件(一般在/dev/shm/或/run/shm/中)

这个只能用于一台服务器吧,有两个节点怎么办

都是第三方模块,性能不错- 每秒300w次查询 跨Cluster是怎么实现的?

c++写的,怎么实现的跨进程共享的

@leapon @blackjack 通过共享内存实现的,多个进程打开同一个共享内存文件并分别map到自己的内存地址空间里面

@wyTrivail 设计目的就是解决单机问题的,所以强调的是高性能,可以同步访问而不需要异步回调;多节点的话可以考虑封装一个网络接口出去,不过效果可能不如直接用memcache/redis

  1. 不支持function传递啊

这只能用于单机,多机部署就不行了,还是不如memcache和redis

收藏,是不是可以用来做单机的进程锁?

赞啊,最近正找这方面的方案呢。

用 socket.pipe(net.connect(“other host”) ) 就可跨机器

让我想起了 openresty的 shared_dict

mac 10.14.1 版本。tnpm install (tnpm:淘宝封装的npm)提示 Package require os(linux) not compatible with your platform(darwin) 有的解吗?123.png

回到顶部