使用lua腳本和jedis實現redis的hmsetnx命令,操作hash表時不覆蓋原有數據


redis中set系列命令(包括set,hset等等),基本上都包括兩個版本,純粹的set和setnx, setnx即set not exist, 也就是只有Key不存在時才會執行set, 而不會覆蓋原有的值。

但是hmset這個命令,包括redis本身,jedis都沒有提供nx版本的支持。當然,hset這個命令是有對應的hsetnx版本的,hmset意思就是multi hset,一次可以操作多個key, 從而減小網絡開銷。

所以,為了在使用hmset時也能降低網絡的消耗,用lua寫了一個腳本,實現hmsetnx的效果,即:向Hash表中set鍵值對時,只有鍵不存在時才會寫入,不會覆蓋原有值。

local key
for i,j in ipairs(ARGV)
do	if i%2 == 0
	then
		redis.call('hsetnx', KEYS[1], key,j)
	else
		key = j
	end
end
return 1

腳本的原理還是比較簡單,腳本中使用的參數和hmset完全一致。依次讀入參數列表,迭代器i是奇數時給key賦值,偶數時執行一次hsetnx,循環結束后也就完成了。

之后再調用jedis封裝好的eval接口,

Object eval(final String script, final List keys, final List args)

或者

Object eval(final byte[] script, final List<byte[]> keys, final List<byte[]> args)

都可以,這兩個接口的區別就是是否對參數進行序列化

keys中只放一個元素,就是hash表本身的key, 然后把鍵值對按照一個key,一個value的順序依次放到args里。

當然,也可以用evalsha命令避免每次操作都要傳輸腳本本身,這里就不細說了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM