lua指令碼保證Redis多條命令原子性

2021-09-28 16:48:47 字數 2036 閱讀 8661

redis能執行lua指令碼,一段lua指令碼可以作為乙個整體,這樣將多條redis命令寫入lua,即可以實現事務的原子性,下面演示了jedis和redistemplate是如何呼叫lua指令碼的

# 完成的功能是 set my_key1 my_value1 ex 15 nx, lua指令碼很神奇不需要加分號和換行符

# 其實該功能在jedis的api裡實現了,但是在spring-data-redis的api裡未實現

# jedis的api public string set

(final string key,

final string value,

final string n***,

final string expx,

final

long time)

, 這個n***即nx或xx, expx即ex或px

jedis j =

getjedis()

;string script =

"local key = keys[1]"

+"local value = ar**[1]"

+"local expireinsecs = ar**[2]"

+"return redis.call(\"set\",key,value,\"ex\",expireinsecs,\"nx\")"

;list

keys = arrays.

aslist

("my_key1");

list

args = arrays.

aslist

("my_value1"

,"15");

object ret = j.

eval

(script, keys, args)

;system.out.

println

(ret)

;

# 目前該**存在乙個問題, 不知為何拿不到返回值

# 可以傳入defaultredisscript,其是 redisscript 的實現,無需自己實現redisscript的所有介面

list

keys = arrays.

aslist

("my_key1");

string[

] args =

;string scripttext =

"local key = keys[1]"

+"local value = ar**[1]"

+"local expireinsecs = ar**[2]"

+"return redis.call(\"set\",key,value,\"ex\",expireinsecs,\"nx\")"

;//scriptsource scriptsource = new resourcescriptsource(new classpathresource("/lua/lock1.lua"));

defaultredisscript

script =

newdefaultredisscript

();script.

setresulttype

(string.

class);

// 【注意】一定要設定,否則返回值都是null

script.

setscripttext

(scripttext)

;string s = jedisutil.redistemplate.

execute

(script, keys, args)

;system.out.

println

(s);

system.out.

println

(jedisutil.string.

get(

"my_key1"))

;// 中文正確

return

responseresult

(s);

redis呼叫lua指令碼

在redis中很多基本操作都是原子操作 但是缺少事務的概念,所幸的是redis支援lua指令碼,可以利用lua指令碼實現事務特性 執行比 較對應key值大小,更新較大值 的lua指令碼 param key param time return public object updatehigherint...

Redis使用lua指令碼

版本 自2.6.0起可用。時間複雜度 取決於執行的指令碼。使用lua指令碼的好處 命令格式 eval script numkeys key key arg arg 說明 簡單例項 127.0.0.1 6379 eval return ar 1 0 100 100 127.0.0.1 6379 eva...

Redis 十六 Lua指令碼

redis 提供了非常豐富的指令集,但是使用者依然不滿足,希望可以自定義擴充若干指令來完成一些特定領域的問題。redis 為這樣的使用者場景提供了 lua 指令碼支援,使用者可以向伺服器傳送 lua 指令碼來執行自定義動作,獲取指令碼的響應資料。redis 伺服器會單執行緒原子性執行 lua 指令碼...