EVAL
在服务端执行一段 Lua 脚本;当 numkeys >= 1 时,路由到 KEYS[1] 所在的 shard。
EVAL script numkeys [key [key ...]] [arg [arg ...]]
复杂度
O(编译 + 脚本自身的开销)。整段脚本在 KEYS[1] 所在的 shard 上作为一个原子单元执行,执行期间独占那个 shard。失控保护用的是指令预算(lua time_limit_ms x 40000 条指令),不是墙钟时间。
复杂度与兼容性是从 kevy 的实现里读出来的,不是抄 Redis 的文档。有几条确实不一样 —— 它们看起来像笔误,但不是。
与 Redis 的兼容性
有差异
有差异:没有 -BUSY 状态,也没有 SCRIPT KILL —— 超预算的脚本就地中止,并以一个普通错误应答;嵌套 EVAL 会被拒绝;redis.call 碰到别的 shard 上的 key 会返回 CROSSSLOT;EVAL 会按 SHA1 自动缓存源码,所以不做 SCRIPT LOAD 也能直接 EVALSHA。