CNode

node-shared-cache: 跨cluster内存共享模块

精华
分享
Kkyriosli发布于11 年前最后回复8 年前16 回复16947 浏览0 收藏

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

  • 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)

L
luoyjx#1·11 年前

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

C
CommanderXL#2·11 年前

同上~

K
kyriosli#3·11 年前
引用 luoyjx程序挂掉重启后不就没了?

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

W
wyTrivail#4·11 年前

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

L
leapon#5·11 年前

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

B
blackjack#6·11 年前

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

K
kyriosli#7·11 年前
引用 leapon都是第三方模块,性能不错 每秒300w次查询 跨Cluster是怎么实现的?

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

K
kyriosli#8·11 年前
引用 wyTrivail这个只能用于一台服务器吧,有两个节点怎么办

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

P
pinotao#9·8 年前

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

C
ChenWeiDi#10·10 年前
  1. 不支持function传递啊
B
bengle#11·10 年前

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

Z
zsea#12·10 年前

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

S
strengthening#13·10 年前

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

Y
yakczh#14·10 年前

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

S
sunzhiguang#15·10 年前

让我想起了 openresty的 shared_dict

I
ipengyo#16·9 年前

666

参与回复
登录后即可参与回复。登录