0Pricing
Lua Academy · 课时

共享内存字典

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. OpenResty 架构
  2. 在 Lua 中处理 HTTP 请求
  3. Cosocket 和非阻塞 TCP
  4. 共享内存字典
← 返回 Lua Academy