[openresty] 利用ngx.shared.DICT 和 lua-resty-lock 做一个内存 cache

637 views
Skip to first unread message

Harold.Miao

unread,
Nov 19, 2013, 5:08:52 AM11/19/13
to openresty
hi all, 
我有一个需求,需要对磁盘文件的头做一个内存缓存。打算用春哥下面两个模块来做
ngx.shared.DICT 和 lua-resty-lock 

我考虑到以下情况:

1. 对于写cache的set操作 要加锁
2. 如果LRU策略正在淘汰的key被访问,也会有问题吧
3. 加了很多锁,会不会影响性能


考虑到cache出问题会很坑爹,所以想到自己考虑的肯定不周全,恳请有相关经验的朋友指点!谢谢

另外还有没有什么更上层的模块可以用的?

--

Best Regards,
Harold Miao

Lance

unread,
Nov 19, 2013, 8:41:12 AM11/19/13
to open...@googlegroups.com
前两天agentzh推荐过一个cloudflare的缓存模块,你可以在本列表搜索一下

Lance


2013/11/19 Harold.Miao <miaoh...@gmail.com>

--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html

Yichun Zhang (agentzh)

unread,
Nov 19, 2013, 3:06:40 PM11/19/13
to openresty
Hello!

2013/11/19 Harold.Miao:
> 我考虑到以下情况:
>
> 1. 对于写cache的set操作 要加锁

由于共享内存字典相关的操作并不涉及任何 IO,甚至不涉及任何系统调用,所以锁的负面效应经常会被夸大。

只有当你有非常多的 nginx worker 进程,同时在单个共享字典中有极多的 key-value 个数(比如百万级或者更多),锁的效应才会比较明显。

建议针对你的实际负载和数据量进行实际测量。你可以通过 off-CPU 和 on-CPU 火焰图量化锁的效应(如果锁的效应足够明显的话)。见

https://github.com/agentzh/nginx-systemtap-toolkit#sample-bt-off-cpu

https://github.com/agentzh/nginx-systemtap-toolkit#sample-bt

> 2. 如果LRU策略正在淘汰的key被访问,也会有问题吧

共享内存字典会保证数据的一致性。对于正在访问的 key 只存在合法和不合法两种情况。

> 3. 加了很多锁,会不会影响性能
>

见我上面对 1) 的评论。

Regards,
-agentzh

Harold.Miao

unread,
Nov 19, 2013, 10:54:18 PM11/19/13
to openresty

谢谢  找到了  ngx.shcache  , 貌似春哥他们公司已经线上在用了

Harold.Miao

unread,
Nov 19, 2013, 10:56:06 PM11/19/13
to openresty

在 2013年11月20日上午4:06,Yichun Zhang (agentzh) <age...@gmail.com>写道:

由于共享内存字典相关的操作并不涉及任何 IO,甚至不涉及任何系统调用,所以锁的负面效应经常会被夸大。

只有当你有非常多的 nginx worker 进程,同时在单个共享字典中有极多的 key-value 个数(比如百万级或者更多),锁的效应才会比较明显。

原来如此,以前对锁认识太极端,谢春哥
Reply all
Reply to author
Forward
0 new messages