redis執(zhí)行l(wèi)ua腳本的實現(xiàn)
redis EVAL命令可以執(zhí)行l(wèi)ua腳本,redis保證腳本執(zhí)行的原子性,腳本由嵌入式執(zhí)行引擎(Lua 5.1解釋器)執(zhí)行。
1,語法
EVAL script numkeys [key [key ...]] [arg [arg ...]]
第一個參數(shù) script 是腳本的源代碼
第二個參數(shù) numkeys 是輸入鍵名參數(shù)的數(shù)量
后面的就是 key 和 參數(shù)。
例如:
> EVAL "return 'Hello, scripting!'" 0 "Hello, scripting!"
其中 "return 'Hello, scripting!'" 就是lua腳本,后面的0就是沒有key 也沒有參數(shù),可以看到redis返回的就是腳本的返回值。
還有一種方式就是 寫一個固定的腳本傳遞參數(shù),比如
> EVAL "return ARGV[1]" 0 'hello scripting' "hello scripting" > EVAL "return ARGV[1]" 0 hello scripting "hello" > EVAL "return ARGV[3]" 0 hello scripting (nil)
可以看到是從[1] 開始獲取,而不是[0],參數(shù)是以空格隔開,如果超出范圍返回nil。
一個使用key的例子
> EVAL "return { KEYS[1], KEYS[2], ARGV[1], ARGV[2], ARGV[3] }" 2 key1 key2 arg1 arg2 arg3 1) "key1" 2) "key2" 3) "arg1" 4) "arg2" 5) "arg3"
可以看到這個lua腳本可以使用{}返回多個值。不知道這個在java 里面返回的是個字符串還是list。
2,調用redis命令
可以通過 redis.call() 或 redis.pcall() 從Lua腳本調用Redis命令。兩者幾乎相同,除了調用 redis.call() 函數(shù)時產(chǎn)生的錯誤會直接返回到執(zhí)行該函數(shù)的客戶端。相反,調用 redis.pcall() 函數(shù)時遇到的錯誤會返回到腳本的執(zhí)行上下文。
例子:
> EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 foo bar OK
簡單的調用了一個set命令,看起來沒有意義,但是多了可以保證原子性就有意義了,比如
> EVAL "local a=redis.call('SET',KEYS[1],ARGV[1]) local b=redis.call('SET',KEYS[2],ARGV[2]) return a and b" 2 k1 k2 v1 v2 OK
3,腳本緩存
> SCRIPT LOAD "return 'Immabe a cached script'" "c664a3bf70bd1d45c4284ffebb65a6f2299bfc9f" > EVALSHA c664a3bf70bd1d45c4284ffebb65a6f2299bfc9f 0 "Immabe a cached script"
可以看到使用script load 緩存一個腳本,返回一個ID,之后可以通過evalsha ID 來調用它。
至于lua腳本語言這個東西,摸索著寫寫就熟悉了。舉幾個例子:
獲取并刪除
local value = redis.call('get', KEYS[1]) if value then redis.call('del', KEYS[1]) return value else return nil end
解釋,定義一個變量value如果獲取到了keys[1]的值,就是刪除這個值并返回OK否則返回nil,還可以寫成
if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end
看起來跟shell腳本差不多吧。
到此這篇關于redis執(zhí)行l(wèi)ua腳本的實現(xiàn)的文章就介紹到這了,更多相關redis執(zhí)行l(wèi)ua腳本內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
window環(huán)境redis通過AOF恢復數(shù)據(jù)的方法
這篇文章主要介紹了window環(huán)境redis通過AOF恢復數(shù)據(jù)的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11Redis shake實現(xiàn)可視化監(jiān)控的示例代碼
Redis可視化監(jiān)控是通過監(jiān)控Redis服務器的各項指標和狀態(tài),并將其以可視化的方式展示給用戶,本文給大家介紹了Redis shake實現(xiàn)可視化監(jiān)控,并通過代碼示例講解的非常詳細,需要的朋友可以參考下2024-03-03從原理到實踐分析?Redis?分布式鎖的多種實現(xiàn)方案
在分布式系統(tǒng)中,為了保證多個進程或線程之間的數(shù)據(jù)一致性和正確性,需要使用鎖來實現(xiàn)互斥訪問共享資源,然而,使用本地鎖在分布式系統(tǒng)中存在問題,這篇文章主要介紹了從原理到實踐分析?Redis?分布式鎖的多種實現(xiàn)方案,需要的朋友可以參考下2024-07-07