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

redis原子性控制超卖问题

老师,既然redis是单线程,那为什么非要配合lua呢,直接在代码里执行redis->eval或者redis->incrby不就能控制超卖么,

正在回答

1 回答

同学你好,你的思路不错,可以继续去想下直接incrby改会有什么问题,老师提供的思路只是其中一个方案,真正场景实现肯定会有非常多的方案,需要大家自己思考。
redis->eval本身就是执行lua脚本,redis->incrby理论上也可以防止边界条件的发生,不会造成超卖,因为incrby就实现了查询+修改的原子操作,但是有一点点小缺点就是,不能做到只要一超卖了就直接终止+1。

0 回复 有任何疑惑可以回复我~
#1

MKfans菜鸟

老师我也有个问题不明白,有一点点小缺点就是,不能做到只要一超卖了就直接终止+1,这句话是因为这个redis->eval这个东西在redis里面执行的,所以不存在这个情况,如果放到php中去执行,因为redis线程竞争,有可能在最后一件的时候出现,2个前后查完,第一个正在写的,第二个也准备写缘故吗?
2019-10-06 回复 有任何疑惑可以回复我~
#2

皮奇 回复 MKfans菜鸟

后半部分数对的,但是前半部分你说的错了,不是redis线程竞争的问题,因为Redis的命令执行时单进程单线程模型。你可以思考下,incrby做计数,你想做到超卖了就直接终止+1,是不是每次之前都得先读一次计数,然后决定是否有调用incrby,此时就是 get + incrby 两次操作,也就是会分成了两次网络调用操作,此时这两个操作在(php)多进程模型下是无法保证原子性操作的。
2019-10-15 回复 有任何疑惑可以回复我~
#3

慕勒4092611 回复 皮奇

老师,你的意思是 我直接用if ($redis->incrby($key, 1) > 1000)判断 是可以做到防超卖,但是这个$key会一直incrby到很大?
2020-05-19 回复 有任何疑惑可以回复我~
#4

慕粉3988021 回复 慕勒4092611

我也想知道,请老师回答
2020-09-17 回复 有任何疑惑可以回复我~
查看1条回复

举报

0/150
提交
取消

redis原子性控制超卖问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信