使用lua脚本和jedis实现redis的hmsetnx命令,操作hash表时不覆盖原有数据
2017-04-06 18:02
911 查看
博客搬家至 https://lcy362.github.io/posts/63756/
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键值对时,只有键不存在时才会写入,不会覆盖原有值。
脚本的原理还是比较简单,脚本中使用的参数和hmset完全一致。依次读入参数列表,迭代器i是奇数时给key赋值,偶数时执行一次hsetnx,循环结束后也就完成了。
之后再调用jedis封装好的eval接口,
Object eval(final String script, final List keys, final List args)
或者
Object eval(final byte[] script, final List
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
相关文章推荐
- redis实现附近的人,但jedis中没有相关api,那么直接使用lua脚本执行。
- Redis使用lua脚本实现increase + expire 的原子操作
- redis中各种数据类型对应的jedis操作命令
- redis中各种数据类型对应的jedis操作命令
- Redis常用数据类型介绍、使用场景及其操作命令
- redis中各种数据类型对应的jedis操作命令
- 【COCOS2DX-LUA 脚本开发之十】使用Lua CJSON库进行encode与decode操作完成对Json数据转化
- Redis常用数据类型介绍、使用场景及其操作命令
- 使用Redis的脚本功能实现Redis中数据简单查询
- Redis 使用 Lua 实现 split 结合 HMGET 批量读取数据
- redis中各种数据类型对应的jedis操作命令、redis命令大全
- Linux下使用命令获取redis数据脚本
- redis中各种数据类型对应的jedis操作命令
- redis中各种数据类型对应的jedis操作命令
- MongoDB_03之使用shell命令实现对文档数据的操作
- redis中各种数据类型对应的jedis操作命令
- redis中各种数据类型对应的jedis操作命令
- redis中各种数据类型对应的jedis操作命令
- Redis常用数据类型介绍、使用场景及其操作命令
- redis中各种数据类型对应的jedis操作命令