• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

使用lua脚本和jedis实现redis的hmsetnx命令,操作hash表时不覆盖原有数据 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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命令避免每次操作都要传输脚本本身,这里就不细说了。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Nginx内嵌lua脚本,结合Redis使用发布时间:2022-07-22
下一篇:
Lua调试库发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap