OpenResty 中有两个缓存的组件:shared dict 缓存和 lru 缓存。前者只能缓存字符串对象,缓存的数据有且只有一份,每一个 worker 都可以进行访问,所以常用于 worker 之间的数据通信,同时还支持对过期的数据进行访问获取。后者则可以缓存所有的 Lua 对象,但只能在单个 worker 进程内访问,有多少个 worker,就会有多少份缓存数据。
lua-resty-mlcache
这个库可以作为 key/value存储来处理,也可以缓存Lua类型和表,构建在lua_shared_dict,lua-resty-lrucache上 ,这种组合可以实现高性能和灵活的缓存。
功能:
- 使用TTL缓存和负缓存,
- 通过lua-resty-lock构建互斥体,以防止在缓存失败时将狗堆影响到数据库/后端,
- 内置worker通信,传播缓存失效,并允许worker更新他们的L1 (lua-resty-lrucache )缓存的更改(set(),delete() ),
- 可以创建多个独立实例来保存各种类型的数据,同时依赖同一lua_shared_dict L2缓存,
此库中内置的各种缓存级别的说明,引用官方图片说明。
缓存级别层次结构为:
L1 :使用Least-Recently-Used land缓存lua-resty-lrucache ,在填充时提供最快的查找,并避免耗尽worker的Lua虚拟机内存,
L2 :所有员工共享的lua_shared_dict内存区域,只有L1未命中时才能访问此级别,并防止工作人员请求L3缓存,
L3 :自定义函数,只由单个worker运行,以避免数据库/后端(通过lua-resty-lock )上的狗堆效应,通过L3获取的值将被设置为L2缓存,供其他员工访问,
- 本文作者: 李宏伟
- 本文链接: https://blog.chuangketime.com/2023/03/24/Lua-resty-mlcache库/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!