Redis 2.6+ 內建 Lua 5.1 解釋器。EVAL script numkeys key [key ...] arg [arg ...]
KEYS[1]..KEYS[n](1-based 陣列)。ARGV[1]..ARGV[m] 存取。> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1" 2) "key2" 3) "first" 4) "second"
| Redis → Lua | Lua → Redis |
|---|---|
| Integer → number | number → Integer (捨去小數) |
| Bulk Reply → string | string → Bulk Reply |
| Multi Bulk → table (可巢狀) | table (陣列) → Multi Bulk (遇 nil 截斷) |
| Status → {ok=狀態} | {ok=狀態} → Status Reply |
| Error → {err=錯誤} | {err=錯誤} → Error Reply |
| Nil → false | false → Nil Bulk Reply |
| true → Integer 1 |
輔助函數:redis.error_reply(msg)、redis.status_reply(msg)。
redis.call():命令報錯 → 拋出 Lua 錯誤 → EVAL 返回錯誤。redis.pcall():捕獲錯誤 → 返回錯誤表,腳本可自行處理。EVALSHA sha1 numkeys ... 避免重複傳送腳本本文,節省頻寬。Redis 永久快取已執行腳本(除非 SCRIPT FLUSH 或重啟)。
管道化場景建議:SCRIPT LOAD 預載 → 管道內直接 EVALSHA,或客戶端樂觀發送 EVALSHA 失敗再退回 EVAL。
SCRIPT FLUSH:清空快取(雲環境切換租戶必備)。SCRIPT EXISTS sha1 ...:檢查腳本是否在快取(返回 1/0 陣列)。SCRIPT LOAD script:載入腳本至快取不執行。SCRIPT KILL:終止超時的唯讀腳本;已寫入數據則只能 SHUTDOWN NOSAVE。腳本必須為純函數:相同輸入必產生相同寫操作。禁用 TIME、RANDOMKEY 等非確定性命令(唯讀腳本除外)。Lua math.random 種子固定,每次執行序列相同。
需隨機性時:客戶端生成種子作為參數傳入,腳本用 math.randomseed(ARGV[1]),確保主從/AOF 重放一致。
local 關鍵字。redis.sha1hex。redis.log(level, msg) 寫入 Redis 日誌(level: DEBUG/VERBOSE/NOTICE/WARNING)。lua-time-limit 可調),超時不自動終止,但進入 BUSY 狀態僅接受 SCRIPT KILL/SHUTDOWN NOSAVE。腳本內 SELECT 僅影響腳本自身執行上下文,不再改變客戶端連線的資料庫號。