0Pricing
Lua Academy · 课时

SCRIPT LOAD 和 EVALSHA

使用 SCRIPT LOAD 加载脚本,并通过 SHA1 执行以提高效率。

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

EVAL 的问题

EVAL 会在每次调用时发送完整的脚本文本。对于频繁执行的脚本,这会浪费带宽。SCRIPT LOAD + EVALSHA 通过只加载一次并使用 SHA1 哈希调用来解决这一问题。

SCRIPT LOAD

SCRIPT LOAD script 会编译脚本,将其缓存到 Redis 中,并返回其 SHA1 哈希值。脚本会一直缓存,直到服务器重启或调用 SCRIPT FLUSH。

# Redis CLI:
SCRIPT LOAD "return redis.call('GET', KEYS[1])"
# Returns: "abc123...sha1hash..."

EVALSHA

EVALSHA sha1 numkeys [keys] [args] 会执行之前加载的、由其 SHA1 标识的脚本。如果脚本未缓存,则会因 NOSCRIPT 而失败。

# Redis CLI:
EVALSHA abc123...sha1hash... 1 mykey
# Returns the same result as EVAL

应用程序模式

应用程序启动时:使用 SCRIPT LOAD 加载所有脚本,并存储它们的 SHA1 值。之后所有运行时调用都使用 EVALSHA。

local redis = require("redis")
local scriptText = [[
  local v = redis.call("GET", KEYS[1])
  return v
]]
local sha = redis:script_load(scriptText)
-- Later:
redis:evalsha(sha, 1, "mykey")

处理 NOSCRIPT 错误

如果 Redis 重启,缓存的脚本就会丢失。捕获 NOSCRIPT 错误,并回退到 EVAL 以重新加载脚本。

local function safeEvalsha(r, sha, script, numkeys, ...)
  local ok, result = pcall(r.evalsha, r, sha, numkeys, ...)
  if not ok and result:find("NOSCRIPT") then
    sha = r:script_load(script)
    result = r:evalsha(sha, numkeys, ...)
  end
  return result
end

SCRIPT EXISTS

SCRIPT EXISTS sha1 [sha1 ...] 检查脚本是否已缓存。每个已缓存的脚本返回 1,缺失的脚本返回 0。重启后可使用它进行预热。

SCRIPT FLUSH

SCRIPT FLUSH 会从 Redis 内存中移除所有缓存的脚本。在脚本发生变化的部署期间使用。

脚本版本控制

脚本发生变化时,其 SHA1 也会变化。将 SHA1 与版本号一起存储,并在部署后更新。

节省带宽

对于每秒调用 10,000 次的 500 字节脚本,与 EVAL 相比,EVALSHA 可节省 5 MB/s 的 Redis 流量。在大规模场景下,这一节省相当可观。

使用 EVALSHA 的 Redis 集群

在集群模式下,EVALSHA 与 EVAL 一样受到槽位限制:所有 KEYS 都必须位于同一个槽位。

最佳实践

生产环境中,应在启动时加载脚本,然后始终使用 EVALSHA。实现 NOSCRIPT 回退机制,以便在 Redis 重启后保持可靠性。

EVALSHA 问题

EVALSHA 使用什么来代替脚本文本?

回顾:SCRIPT LOAD 与 EVALSHA

使用 SCRIPT LOAD 一次性加载脚本并获取 SHA1。后续所有调用都使用 EVALSHA,以节省带宽。通过重新加载来处理 NOSCRIPT 错误;SCRIPT EXISTS 检查缓存状态,SCRIPT FLUSH 清空缓存。

常见问题解答

「SCRIPT LOAD 和 EVALSHA」课时是免费的吗?

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

「SCRIPT LOAD 和 EVALSHA」这节课中我会学到什么?

使用 SCRIPT LOAD 加载脚本,并通过 SHA1 执行以提高效率。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

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

「SCRIPT LOAD 和 EVALSHA」课时需要多长时间?

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

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

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

此课程中的所有课时

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