redis中的两个坑 一个随机性写入被拒绝 二是增减指定数值

1.在redis中使用脚本 调用 redis.call('time')[1] 报错如下

ERR Error running script (call to f_e745355f11745192bd45376618a34bec9145653b): @user_script:1: @user_script: 1: Write commands not allowed after non deterministic comman
ds

原因与解决

Redis内嵌了Lua环境来支持用户扩展功能,但是出于数据一致性考虑,要求脚本必须是纯函数的形式,也就是说对于一段Lua脚本给定相同的参数,写入Redis的数据也必须是相同的,对于随机性的写入Redis是拒绝的。

通过外部传入时间戳进行实现即可 毕竟目前需求就是秒级 无需做其他任何特殊处理 所以不用 redis.call('time')[1] 命令实现

2.在redis中使用 INCRBY  DECRBY 的命令 报错如下

"ERR Error running script (call to f_b861f530653ba93cdeea2e273fbb90c995b1bec9): @user_script:88: ERR value is not an integer or out of ra
nge 

原因与解决

incrby不支持浮点运算,可以采用incrbyfloat支持浮点运算

不过没有 decrbyfloat 这样的命令 那么可以使用下面的方式 负数形式完成减法

incrbyfloat key  -1.1

不过在lua脚本中属于原子性 所以可以自己取出来计算好再set回去  所以注意不要在lua代码外自己取出来并计算后set进去 可能会导致结果不准确

incrby这种也算是原子性的 只是多条命令可能会破坏原子性 ,那么最终的建议是 可不使用浮点数  能自己转换为整型去处理最好 不然可能还要去考虑精度等等问题

以上问题我是我在锁中遇到的 为了解决超卖  一个是加锁解锁模式 另一个是无锁的队列模式

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值