redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)
redis EVAL命令可以執(zhí)行l(wèi)ua腳本,redis保證腳本執(zhí)行的原子性,腳本由嵌入式執(zhí)行引擎(Lua 5.1解釋器)執(zhí)行。
1,語(yǔ)法
EVAL script numkeys [key [key ...]] [arg [arg ...]]
第一個(gè)參數(shù) script 是腳本的源代碼
第二個(gè)參數(shù) numkeys 是輸入鍵名參數(shù)的數(shù)量
后面的就是 key 和 參數(shù)。
例如:
> EVAL "return 'Hello, scripting!'" 0 "Hello, scripting!"
其中 "return 'Hello, scripting!'" 就是lua腳本,后面的0就是沒(méi)有key 也沒(méi)有參數(shù),可以看到redis返回的就是腳本的返回值。
還有一種方式就是 寫一個(gè)固定的腳本傳遞參數(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。
一個(gè)使用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"
可以看到這個(gè)lua腳本可以使用{}返回多個(gè)值。不知道這個(gè)在java 里面返回的是個(gè)字符串還是list。
2,調(diào)用redis命令
可以通過(guò) redis.call() 或 redis.pcall() 從Lua腳本調(diào)用Redis命令。兩者幾乎相同,除了調(diào)用 redis.call() 函數(shù)時(shí)產(chǎn)生的錯(cuò)誤會(huì)直接返回到執(zhí)行該函數(shù)的客戶端。相反,調(diào)用 redis.pcall() 函數(shù)時(shí)遇到的錯(cuò)誤會(huì)返回到腳本的執(zhí)行上下文。
例子:
> EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 foo bar OK
簡(jiǎn)單的調(diào)用了一個(gè)set命令,看起來(lái)沒(méi)有意義,但是多了可以保證原子性就有意義了,比如
> 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 緩存一個(gè)腳本,返回一個(gè)ID,之后可以通過(guò)evalsha ID 來(lái)調(diào)用它。
至于lua腳本語(yǔ)言這個(gè)東西,摸索著寫寫就熟悉了。舉幾個(gè)例子:
獲取并刪除
local value = redis.call('get', KEYS[1]) if value then redis.call('del', KEYS[1]) return value else return nil end
解釋,定義一個(gè)變量value如果獲取到了keys[1]的值,就是刪除這個(gè)值并返回OK否則返回nil,還可以寫成
if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end
看起來(lái)跟shell腳本差不多吧。
到此這篇關(guān)于redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)redis執(zhí)行l(wèi)ua腳本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
window環(huán)境redis通過(guò)AOF恢復(fù)數(shù)據(jù)的方法
這篇文章主要介紹了window環(huán)境redis通過(guò)AOF恢復(fù)數(shù)據(jù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Redis內(nèi)存碎片率調(diào)優(yōu)處理方式
Redis集群因內(nèi)存碎片率超過(guò)1.5觸發(fā)告警,分析發(fā)現(xiàn)內(nèi)因與外因?qū)е聝?nèi)存碎片,內(nèi)因?yàn)椴僮飨到y(tǒng)內(nèi)存分配機(jī)制,外因?yàn)镽edis操作特性,使用Redis內(nèi)置內(nèi)存碎片清理機(jī)制可有效降低碎片率,但需注意可能影響性能,建議使用MEMORY命令診斷內(nèi)存使用情況,合理配置參數(shù)以優(yōu)化性能2024-09-09Redis shake實(shí)現(xiàn)可視化監(jiān)控的示例代碼
Redis可視化監(jiān)控是通過(guò)監(jiān)控Redis服務(wù)器的各項(xiàng)指標(biāo)和狀態(tài),并將其以可視化的方式展示給用戶,本文給大家介紹了Redis shake實(shí)現(xiàn)可視化監(jiān)控,并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-03-03Redis 如何批量設(shè)置過(guò)期時(shí)間(PIPLINE的使用)
有時(shí)候我們并不希望redis的key一直存在。例如緩存,驗(yàn)證碼等數(shù)據(jù),我們希望它們能在一定時(shí)間內(nèi)自動(dòng)的被銷毀。本文就詳細(xì)的介紹一下Redis 如何批量設(shè)置過(guò)期時(shí)間,感興趣的可以了解一下2021-11-11從原理到實(shí)踐分析?Redis?分布式鎖的多種實(shí)現(xiàn)方案
在分布式系統(tǒng)中,為了保證多個(gè)進(jìn)程或線程之間的數(shù)據(jù)一致性和正確性,需要使用鎖來(lái)實(shí)現(xiàn)互斥訪問(wèn)共享資源,然而,使用本地鎖在分布式系統(tǒng)中存在問(wèn)題,這篇文章主要介紹了從原理到實(shí)踐分析?Redis?分布式鎖的多種實(shí)現(xiàn)方案,需要的朋友可以參考下2024-07-07