0Pricing
Lua Academy · 课时

EVAL 和 Redis Lua 环境

使用 EVAL 执行 Lua 脚本,理解 KEYS/ARGV,并掌握脚本缓存。

EVAL 和 Redis Lua 环境 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。

为什么在 Redis 中使用 Lua?

Redis 允许使用 EVAL 在服务器内部运行 Lua 脚本。脚本会以原子方式执行——不会有其他 Redis 命令并发运行,因此可以安全地执行多步操作。

EVAL 命令

EVAL script numkeys key [key ...] arg [arg ...]——脚本通过 KEYS 表访问键,通过 ARGV 表访问参数(索引从 1 开始)。

-- Redis CLI:
EVAL "return KEYS[1]" 1 mykey
-- Returns: mykey

访问 KEYS 和 ARGV

在 Lua 中,KEYS 和 ARGV 是由 EVAL 填充的全局表。

EVAL "
local key = KEYS[1]
local val = ARGV[1]
redis.call('SET', key, val)
return redis.call('GET', key)
" 1 greeting hello

redis.call 与 redis.pcall 的比较

redis.call(cmd, ...) 执行 Redis 命令,并在失败时引发 Lua 错误。redis.pcall 会返回错误表,而不是引发错误。

local ok, err = pcall(function()
  redis.call("INVALID_CMD")
end)
if not ok then print("Error caught:", err) end

返回值

Lua 类型会转换为 Redis 回复类型:数字 → 整数,字符串 → 批量字符串,表 → 多批量数组,false/nil → nil 回复,true → 整数 1。

脚本缓存

Redis 按 SHA1 缓存已编译的脚本。第一次 EVAL 会编译并缓存脚本。后续使用相同 SHA(通过 EVALSHA)的调用会跳过编译。

访问 Redis 数据类型

所有标准 Redis 命令都可以通过 redis.call 使用:GET、SET、HGET、LPUSH、EXPIRE 等。

local count = redis.call("INCR", KEYS[1])
redis.call("EXPIRE", KEYS[1], 3600)
return count

原子性保证

Lua 脚本运行期间,Redis 会阻塞所有其他客户端。脚本应当运行得很快(几微秒到几毫秒)。运行时间过长的脚本会阻塞整个服务器。

Redis 中的 Lua 版本

Redis 内置 Lua 5.1(或与 5.1 兼容的版本)。某些功能(例如 goto 和 bit32)可能有所不同。对于 JSON/MessagePack,请使用 Redis 提供的 cjson 和 cmsgpack 库。

错误处理最佳实践

对于可能失败的操作(例如类型错误),请使用 redis.pcall。返回结构化的错误表,供客户端解析。

调试 Redis 脚本

使用 redis.log(redis.LOG_DEBUG, "message") 将调试消息写入 Redis 日志。在执行 SCRIPT LOAD 之前,先在 redis-cli 中使用 EVAL 测试脚本。

Redis Lua 问题

在 Redis 中使用 EVAL 运行 Lua 脚本的主要好处是什么?

回顾:EVAL 与 Redis Lua 环境

EVAL 会在 Redis 中以原子方式运行 Lua 脚本。通过 KEYS[n] 访问键,通过 ARGV[n] 访问参数。使用 redis.call 执行命令。脚本按 SHA1 缓存。保持脚本运行迅速,以免阻塞服务器。

常见问题解答

「EVAL 和 Redis Lua 环境」课时是免费的吗?

是的 — 「EVAL 和 Redis Lua 环境」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「EVAL 和 Redis Lua 环境」这节课中我会学到什么?

使用 EVAL 执行 Lua 脚本,理解 KEYS/ARGV,并掌握脚本缓存。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「EVAL 和 Redis Lua 环境」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Lua Academy 课中编写并运行代码吗?

能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. EVAL 和 Redis Lua 环境
  2. 原子操作和事务
  3. 使用 Lua 实现速率限制
  4. SCRIPT LOAD 和 EVALSHA
← 返回 Lua Academy