Redis如何实现add(key)操作?

济南大飞哥 2018-11-14 03:10:01
redis没有add操作,像memcacehd是有的。如果key存在返回false,不存在就存入值了。
但是redis没有这个原子操作,它只有set操作。想用脚本实现,不想写成lua脚本保存文件那种方式,想直接发送代码过去,不知道怎么实现。
...全文
456 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
济南大飞哥 2018-11-14
  • 打赏
  • 举报
回复
引用 4 楼 flyfeifei66 的回复:
[quote=引用 2 楼 sinat_31240689 的回复:] 先get,如果没有再set。redis的save是直接覆盖了原来的值
哪里这么简单,如果有两个线程同时访问,同时判断不存在,都是add,那么会以后者为准。 如果是memecaed,它是以前者进去的为主,这个肯定是不行的。[/quote] 这个如果加锁的话,如果是分布式环境(不止一台服务器),就得加分布式锁,如果基于redis搞个分布式锁,需要很多代码,考虑很多情况,否则很容易死锁,网上有些分布式锁的代码,仅仅是思路。
济南大飞哥 2018-11-14
  • 打赏
  • 举报
回复
引用 5 楼 sinat_31240689 的回复:
[quote=引用 4 楼 flyfeifei66 的回复:] [quote=引用 2 楼 sinat_31240689 的回复:] 先get,如果没有再set。redis的save是直接覆盖了原来的值
哪里这么简单,如果有两个线程同时访问,同时判断不存在,都是add,那么会以后者为准。 如果是memecaed,它是以前者进去的为主,这个肯定是不行的。[/quote] 既然都考虑到了,那为什么不加个redis同步锁呢[/quote]

 String script = "if redis.call('exists', KEYS[1]) == 0 then return redis.call('set', KEYS[1], ARGV[1]) else return 0 end";
        
        ShardedJedis jedis = RedisCacheFactory.getInstance().getResource(cluster);
        
        Jedis shard = jedis.getShard(key);
        
        Object msg = shard.eval(script,
                Collections.singletonList(key),
                Collections.singletonList(JSONUtil.toJSONStringWithClassName(value)));
自己搞定了,贴一下核心代码,还是写的lua脚本,之所以感觉难,是因为不懂lua,其实只是很基本的语句。
  • 打赏
  • 举报
回复
引用 4 楼 flyfeifei66 的回复:
[quote=引用 2 楼 sinat_31240689 的回复:]
先get,如果没有再set。redis的save是直接覆盖了原来的值

哪里这么简单,如果有两个线程同时访问,同时判断不存在,都是add,那么会以后者为准。
如果是memecaed,它是以前者进去的为主,这个肯定是不行的。[/quote]
既然都考虑到了,那为什么不加个redis同步锁呢
济南大飞哥 2018-11-14
  • 打赏
  • 举报
回复
引用 2 楼 sinat_31240689 的回复:
先get,如果没有再set。redis的save是直接覆盖了原来的值
哪里这么简单,如果有两个线程同时访问,同时判断不存在,都是add,那么会以后者为准。 如果是memecaed,它是以前者进去的为主,这个肯定是不行的。
咸哼酒家 2018-11-14
  • 打赏
  • 举报
回复
是滴,楼上说的很对
  • 打赏
  • 举报
回复
先get,如果没有再set。redis的save是直接覆盖了原来的值
田小瘦 2018-11-14
  • 打赏
  • 举报
回复
你可以先检测有没有这个key

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧