使用Lua的好處
- 命令原子執行,執行過程中不會插入其他命令
- 定製命令,並存在redis中複用
- 一次網絡IO發送多個命令,減少網絡開銷
執行Lua的兩個方法
1、eval:
eval 腳本內容 key個數 key列表 參數列表
127.0.0.1:6379> eval 'return "hello " .. KEYS[1] .. " " .. ARGV[1]' 1 redis why
"hello redis why"
2、evalsha:
先通過script load命令將Lua腳本加載到Redis,得到該腳本的SHA1校驗和,服務端保存hash值到Lua腳本的映射關係,evalsha命令使用SHA1作爲參數可以直接執行對應Lua腳本,腳本常駐Redis服務端,達到複用
在Lua腳本中調用redis命令
redis.call("set", "why", "why")
管理Lua腳本
- script load:將腳本加載到Redis內存中
- script exists:判斷sha1是否已經加載到Redis內存中
- script flush:清除所有Lua腳本
- script kill:殺掉正在執行到Lua腳本(假如當前Lua腳本已經執行過寫操作,那麼kill將不會生效,只能使用shutdown sava)
實例
vim why_lua.lua
redis.call("set", "why", "why")
redis.call("get", "why")
redis.call("del", "why")
redis.call("get", "why")
return "success!"
$redis-cli script load "$(cat why_lua.lua)"
"6bf3b28be7483331014e8b03f5014e5c0f89d1fc"
$redis-cli evalsha 6bf3b28be7483331014e8b03f5014e5c0f89d1fc 0
"success!"
$redis-cli
127.0.0.1:6379> evalsha 6bf3b28be7483331014e8b03f5014e5c0f89d1fc 0
"success!"