Nginx之Openresty缓存解读

简介: Nginx之Openresty缓存解读

lua_shared_dict

语法:lua_shared_dict <名称> <大小>

默认值:

上下文:http

阶段:取决于使用情况

声明一个共享内存区域 ,<name>作为基于 shm 的 Lua 字典的存储ngx.shared.<name>。共享内存区域始终由当前 Nginx 服务器实例中的所有 Nginx 工作进程共享。该<size>参数接受大小单位,例如km

 http {
     lua_shared_dict shared_data  1;
     ...
 }
local shared_data = ngx.shared.shared_data  
local i = shared_data:get("i")  
if not i then  
    i = 1  
    shared_data:set("i", i)  
    ngx.say("lazy set i ", i, "<br/>")  
end  
i = shared_data:incr("i", 1)  
ngx.say("i=", i, "<br/>")

lua-resty-lrucache

Lua 实现的一个简单的 LRU 缓存,适合在 Lua 空间里直接缓存较为复杂的 Lua 数据结构:它相比 ngx_lua 共享内存字典可以省去较昂贵的序列化操作,相比 memcached 这样的外部服务又能省去较昂贵的 socket 操作

LRU 缓存完全驻留在 Lua VM 中,并受 Lua GC 的约束。因此,不要期望它能够跨操作系统进程边界共享。好处是您可以缓存任意复杂的 Lua 值(例如深度嵌套的 Lua 表),而无需序列化的开销(与 的ngx_lua共享字典 API一样)。缺点是您的缓存始终仅限于当前操作系统进程(即当前 Nginx 工作进程)。在init_by_lua的上下文中使用这个库并没有多大意义 ,因为缓存不会被任何工作进程共享(除非你只是想用预定义的项目“预热”缓存,这些项目将由工人通过fork())。

新建

syntax: cache, err = lrucache.new(max_items [, load_factor])

创建一个新的缓存实例。失败时,返回nil一个描述错误的字符串。

max_items参数指定此缓存可以容纳的最大项目数。

load-factor参数指定内部使用的基于 FFI 的哈希表的“负载因子” resty.lrucache.pureffi默认值为0.5(即50%);如果指定了负载因子,则其将被钳制在 的范围内[0.1, 1](即,如果负载因子大于 1,则其将饱和至 1;同样,如果负载因子小于0.1,则其将被钳制至0.1)。这种说法只对 有意义 resty.lrucache.pureffi

设置

syntax: cache:set(key, value, ttl?, flags?)

设置一个带有值和过期时间的键。

当缓存已满时,缓存将自动驱逐最近最少使用的项目。

可选ttl参数指定过期时间。时间值以秒为单位,但您也可以指定小数部分(例如0.25)。 nil ttl参数意味着该值永远不会过期(这是默认值)。

可选flags参数指定与要存储的项目关联的用户标志值。稍后可以将其与该物品一起检索。用户标志在内部存储为无符号 32 位整数,因此必须指定为 Lua 数字。如果未指定,标志将具有默认值0。此参数已添加到v0.10版本中。

获取

syntax: data, stale_data, flags = cache:get(key)

使用键获取值。如果key在缓存中不存在或者已经过期,nil将会被返回。

从 开始v0.03,过时数据也会作为第二个返回值(如果有)返回。

从 开始v0.10,与存储项关联的用户标记值也作为第三个返回值返回。如果没有为某个项目指定用户标志,则其默认标志将为0

删除

syntax: cache:delete(key)

从缓存中删除由键指定的项目。

综合使用案例

新建文件cache.lua

cd /usr/local/openresty/lualib
mkdir my
cd my
vim cache.lua    #内容写下面lua文件代码

lua文件代码:自定义函数

local _M = {}
lrucache = require "resty.lrucache"
c, err = lrucache.new(200)  -- allow up to 200 items in the cache
ngx.say("count=init")
if not c then
    error("failed to create the cache: " .. (err or "unknown"))
end
function _M.go()
count = c:get("count")
c:set("count",100)
ngx.say("count=", count, " --<br/>")
if not count then  
    c:set("count",1)
    ngx.say("lazy set count ", c:get("count"), "<br/>")  
else
c:set("count",count+1)
ngx.say("count=", count, "<br/>")
end
end
return _M

nginx配置文件引用lua文件

#注释掉http中的代码热部署,否则lua文件中每次都会new一个新对象
#lua_code_cache off;
lua_shared_dict shared_data 1m;
location /lua {
    ...
    #content_by_lua_file lua/hello.lua;   #需注释,否则与lua_block冲突
    content_by_lua_block {
      require("my/cache").go()
    }
}

计数

syntax: count = cache:count()

返回当前存储在缓存中的项目数,包括 过期项目(如果有)。

返回的count值将始终大于或等于 0 且小于或等于size给定的参数cache.new。

该方法已添加到v0.10版本中。

全部刷新

syntax: cache:flush_all()

刷新当前缓存实例中的所有现有数据(如果有)。这是一个O(1)操作,应该比创建全新的缓存实例快得多。但请注意,flush_all()的方法resty.lrucache.pureffi是一个 O(n)操作。

相关文章
|
6月前
|
缓存 应用服务中间件 nginx
百度搜索:蓝易云【nginx反向代理缓存教程。】
现在,nginx已经配置了反向代理缓存。它将缓存后端服务器的响应,并在下次请求时直接提供缓存的响应,减轻后端服务器的负载并提高性能。
192 1
|
7月前
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块(下)
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块
80 0
|
2月前
|
缓存 JavaScript 前端开发
Nginx 缓存使用指南-简单
Nginx 缓存使用指南-简单
19 0
|
8月前
|
消息中间件 NoSQL 关系型数据库
Linux安装 OpenResty、Nginx、PHP、Mysql、Redis、Lua、Node、Golang、MongoDB、Kafka等
Linux安装 OpenResty、Nginx、PHP、Mysql、Redis、Lua、Node、Golang、MongoDB、Kafka等
107 0
|
6月前
|
缓存 应用服务中间件 编译器
Nginx之Openresty基本使用解读
Nginx之Openresty基本使用解读
|
7月前
|
缓存 NoSQL 应用服务中间件
基于Nginx+Lua优化多级缓存架构
基于Nginx+Lua优化多级缓存架构
117 0
|
7月前
|
缓存 NoSQL 应用服务中间件
基于Redis和Nginx实现高并发缓存架构
基于Redis和Nginx实现高并发缓存架构
424 0
|
7月前
|
负载均衡 应用服务中间件 测试技术
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块(上)
浅谈基于openresty(nginx+lua)开发轻量级,按流量控制的灰度模块
300 0
|
9月前
|
缓存 负载均衡 JavaScript
Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...
Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...
231 0
|
9月前
|
缓存 负载均衡 前端开发
Nginx+HAproxy+Keepaliaved缓存搭建
前端服务有大量的数据需要从后端获取,造成网络带宽的压力,同时也降低了服务性能。为了解决类似的问题, 可以在访问前端时,使用nginx缓存多次需要访问的数据

热门文章

最新文章