共享内存字典
使用 ngx.shared.DICT 在多个工作进程之间缓存数据,实现低延迟查找。
共享内存字典 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
什么是 ngx.shared.DICT
ngx.shared.DICT 是一个可供所有 Nginx 工作进程访问的共享内存区域。它为缓存和协调提供 O(1) 的获取、设置和递增操作。
在 nginx.conf 中声明共享内存
请在 http 块中为共享字典分配名称和大小。
# nginx.conf
http {
lua_shared_dict rate_limit 10m;
lua_shared_dict cache 50m;
lua_shared_dict locks 1m;
}基本的获取与设置
存储和获取值时,可以选择指定 TTL(以秒为单位的生存时间)。
-- content_by_lua_block
local cache = ngx.shared.cache
cache:set("greeting", "Hello, World!", 60) -- expires in 60s
local val = cache:get("greeting")
ngx.say(val) -- Hello, World!原子递增
dict:incr(key, delta, init, expiry) 以原子方式递增计数器。如果键不存在,则将其初始化为 init。
local rl = ngx.shared.rate_limit
local count = rl:incr("req:" .. ngx.var.remote_addr, 1, 0, 60)
if count > 100 then
ngx.exit(429) -- Too Many Requests
end使用共享内存进行速率限制
递增模式实现了一个简单的滑动窗口速率限制器,这是 OpenResty 中最常见的模式之一。
删除与刷新
dict:delete(key) 删除单个键。dict:flush_all() 将所有键标记为已过期(延迟删除)。dict:flush_expired(n) 主动删除已过期的键。
原子添加
dict:add(key, val, expiry) 仅在键尚不存在时设置该键,因此适合用于分布式锁。
local locks = ngx.shared.locks
local ok, err = locks:add("my_lock", true, 5) -- 5s lock
if not ok then
ngx.say("Lock held, try later")
return
end
-- critical section
-- locks:delete("my_lock") -- release共享内存大小规划
每个键值对都有额外开销(约 100 字节)。估算公式:size_mb * 1024^2 / avg_entry_size = 最大条目数。请通过 dict:capacity() 和 dict:free_space() 进行监控。
内存驱逐
字典填满时,OpenResty 会驱逐最旧的条目以腾出空间。请设置适当的 TTL,以控制驱逐行为。
跨工作进程协调
由于所有工作进程共享同一个字典,因此可以使用 :add 进行领导者选举,并使用 :incr 在所有工作进程之间维护全局计数器。
限制
共享字典只支持标量值(字符串、数字、布尔值)。如需存储表,请使用 cjson 将其序列化为 JSON。
共享内存问题
dict:incr(key, 1, 0, 60) 会执行什么操作?
回顾:共享内存字典
ngx.shared.DICT 为所有工作进程提供 O(1) 的原子获取、设置和递增操作。它可用于速率限制、缓存和分布式锁。设置 TTL 以控制驱逐行为。对于复杂值,请将表序列化为 JSON。
常见问题解答
「共享内存字典」课时是免费的吗?
是的 — 「共享内存字典」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「共享内存字典」这节课中我会学到什么?
使用 ngx.shared.DICT 在多个工作进程之间缓存数据,实现低延迟查找。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「共享内存字典」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。