为了账号安全,请及时绑定邮箱和手机立即绑定

Redis如何在并发下让自增key的值不超过某个固定的数?

Redis如何在并发下让自增key的值不超过某个固定的数?

泛舟湖上清波郎朗 2019-01-16 16:58:03
大致代码如下: func(id, ip){ int countId = jedis.hget("count", id); int countIP = jedis.get("count", ip); if(countId >= 5 || countIP>=5){ return; } ... //一些其他操作 //再次判断,怕并发时被其他线程修改过 int countId = jedis.hget("count", id); int countIP = jedis.get("count", ip); if(countId >= 5 || countIP>=5){ doSomething(); jedis.hincrBy("count", id, 1); jedis.hincrBy("count", ip, 1); } } 上述代码只是表达大致意思,因为显然在并发情况下会有问题 我的设想是,譬如做一个类似CAS的,casIncrBy("count", id, 1, 5), 这个原子操作对key值增1,如果>5则失败。然后判断是否失败,失败就不doSomething(),成功就doSomething(). 如何达成?
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

拿出来, 判断一下, 修改后发现大于5把数值改成5..

查看完整回答
反对 回复 2019-03-01
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

可以使用 @oraoto 的思路, 写个lua脚本.
如果lua脚本无法实现业务逻辑, 可以使用WATCH命令, 或者自己实现一个简单的锁, 锁住这个键.
可以参考Redis实战中《4.4 Redis事务》 和 《6.2分布式锁》

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 2085 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信