redis中set系列命令(包括set,hset等等),基本上都包括兩個版本,純粹的set和setnx, setnx即set not exist, 也就是只有Key不存在時才會執行set, 而不會覆蓋原有的值。 但是hmset這個命令,包括redis本身,jedis都沒有提供nx版本的支持。當然,h ...
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
或者
Object eval(final byte[] script, final List
都可以,這兩個介面的區別就是是否對參數進行序列化
keys中只放一個元素,就是hash表本身的key, 然後把鍵值對按照一個key,一個value的順序依次放到args里。
當然,也可以用evalsha命令避免每次操作都要傳輸腳本本身,這裡就不細說了。