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这种也算是原子性的 只是多条命令可能会破坏原子性 ,那么最终的建议是 可不使用浮点数 能自己转换为整型去处理最好 不然可能还要去考虑精度等等问题
以上问题我是我在锁中遇到的 为了解决超卖 一个是加锁解锁模式 另一个是无锁的队列模式