Redis使用Lua腳本自定義原子操作

使用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!"

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章