redis lua脚本实现原子操作

  • 通过lua脚本封装原子操作,对一个key设置比旧数据大的数值,并返回大的数值;如果redis里面不存在该key,直接设置。
  • eval "local a=redis.call('GET',KEYS[1]) if a==false then redis.call('SET',KEYS[1],ARGV[1]) return ARGV[1] elseif tonumber(ARGV[1])>tonumber(a) then redis.call('SET',KEYS[1],ARGV[1]) return ARGV[1] end return a"

  • ===================

  • redis zset当作时间线使用时,做为定时任务的触发,可能存在多个程序往外取数据执行任务然后删掉该数据,这时可能会多个程序取到同一份数据,可以使用脚本封装原子操作  先zrangebyscore ,然后再zremrangebyscore。这样能够保证相同的数据不被多个进程或线程读到。
  • eval "local a=redis.call('ZRANGEBYSCORE',KEYS[1],ARGV[1],ARGV[2]) if next(a)~=nil then redis.call('ZREMRANGEBYSCORE',KEYS[1],ARGV[1],ARGV[2]) end return a"

  • ===================
  • 使用hash存储数据但是限制其长度,超过上限设置失败,通过lua脚本封装并发安全的原子操作。
  • eval "local c=redis.call('hlen',KEYS[1]) if c>=tonumber(ARGV[3]) then return 2 end return redis.call('hset',KEYS[1],ARGV[1],ARGV[2])"  1 chen:hash:limit xin 100 2
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值