PHP 用 redis 做锁 怎么样才是正确的姿势

2019-08-12 19:55:07 +08:00
 emeab

如秒杀环境 现在我的代码是 SETNX 一条数据 在 redis 上. 如果有其他用户在调用该接口就等待 类似文件锁.

但是我测试下来 和开事务的 MySQL 性能差别并不大. 所以该如何正确使用

2050 次点击
所在节点    问与答
7 条回复
czzhengkw
2019-08-12 20:17:46 +08:00
秒杀场景,不要用锁,并发请求串行化(队列),可以通过多个进程去消费请求队列的方式提高性能
emeab
2019-08-12 20:20:09 +08:00
@czzhengkw 但是用队列 如何保证与客户端的沟通呢?
des
2019-08-12 20:52:34 +08:00
先不说该不该用锁,我估计你用法就是错误的,所以才和用事物一样
库存-1 了,就应该解锁的,不要把这个-1 的操作也放到事物里了。失败了可以再加回去

简单来说,锁住的应该是这个库存,而不是整个交易
des
2019-08-12 20:58:52 +08:00
不一定非得用队列,提前把每一个库存生成一条记录。
每次都先删除这个列,即”获得了锁”,请求量大的话可以预先加载到 redis
emeab
2019-08-12 21:50:07 +08:00
@des 其实就算现在我用了锁 我处理订单哪里也还是用了事务, 主要怕代码出 bug 库存扣了但是并没有生成订单(因为这个挺重要的对于我的业务逻辑).

但是锁释放不应该是在订单生成后才释放? 不然你库存回滚了 但是下一个获取锁的人读到的数据是脏数据 /
AngryPanda
2019-08-12 22:09:17 +08:00
emeab
2019-08-13 00:20:03 +08:00
@AngryPanda 我就是按照这个做的 现在正常了 redis 锁比事务快了一倍 thx

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/591286

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX