redis+lua實現指令碼一鍵查詢

程式設計師Forlan發表於2022-06-02

場景

經常需要查redis某個key的值,需要執行三條命令才能查到

  1. redis-cli,啟動redis
  2. select num,選擇db
  3. get key,查詢語句

需要執行三條命令才能實現某個key的查詢

有沒有一種方式,直接一條命令搞定,並且做成指令碼,實現快捷查詢?

通過redis+lua實現的bat指令碼替代上面多次操作

實現

說明:C:\Users\Administrator\Desktop,這個是lua指令碼的存放目錄

單機環境

lua指令碼程式碼
redis.call('SELECT','2')
return redis.call('GET','a')
bat指令碼程式碼
redis-cli --eval C:\Users\Administrator\Desktop\redis1.lua
pause

叢集環境

lua指令碼程式碼
redis.call('SELECT','2')
return redis.call('GET',KEYS[1])
bat指令碼程式碼
redis-cli -h xxx.redis.rds.aliyuncs.com -p 6379 -a user:password --eval C:\Users\Administrator\Desktop\redis.lua key
pause
注意

Redis叢集對lua指令碼限制:呼叫必須要帶有key,否則直接返回錯誤資訊, “-ERR for redis cluster, eval/evalsha number of keys can’t be negative or zerorn”

遇到的問題

指令碼只啟動redis,沒問題,如果配合lua指令碼查詢,會發生閃退?
其實命令已經正常執行了,只不過視窗閃退了
目前解決的辦法是加上pause,讓視窗停留
(error) ERR ‘EVAL’ command keys must in same slot
原因:lua指令碼為保證事務,傳入的key必須是在同一個slot中
解決:在KEY上加{},這樣在hash key 的時候只會計算{}內的內容,使得Key落在同一個slot內
比如,我們原來的key是ali1,ali2,現在我們寫成{ali}1,{ali}2,就不會報錯

擴充

設定指定key的value,傳入key的舊值和新值

lua指令碼程式碼
if val == ARGV[1]
then
	redis.call('SET', KEYS[1], ARGV[2])
	return 1
else
	return 0
end
bat指令碼程式碼
redis-cli --eval C:\Users\Administrator\Desktop\redis1.lua  a , 1 2
pause

上面的程式碼實現了把a的值從1改為2
注意:[key…]空格,空格[args…],英文逗號要用空格隔開,所有單詞都要用空格隔開,不然執行不成功

相關文章