如秒杀环境 现在我的代码是 SETNX 一条数据 在 redis 上. 如果有其他用户在调用该接口就等待 类似文件锁.
但是我测试下来 和开事务的 MySQL 性能差别并不大. 所以该如何正确使用
1
czzhengkw 2019-08-12 20:17:46 +08:00
秒杀场景,不要用锁,并发请求串行化(队列),可以通过多个进程去消费请求队列的方式提高性能
|
3
des 2019-08-12 20:52:34 +08:00 via Android
先不说该不该用锁,我估计你用法就是错误的,所以才和用事物一样
库存-1 了,就应该解锁的,不要把这个-1 的操作也放到事物里了。失败了可以再加回去 简单来说,锁住的应该是这个库存,而不是整个交易 |
4
des 2019-08-12 20:58:52 +08:00 via Android
不一定非得用队列,提前把每一个库存生成一条记录。
每次都先删除这个列,即”获得了锁”,请求量大的话可以预先加载到 redis |
5
emeab OP @des 其实就算现在我用了锁 我处理订单哪里也还是用了事务, 主要怕代码出 bug 库存扣了但是并没有生成订单(因为这个挺重要的对于我的业务逻辑).
但是锁释放不应该是在订单生成后才释放? 不然你库存回滚了 但是下一个获取锁的人读到的数据是脏数据 / |
6
AngryPanda 2019-08-12 22:09:17 +08:00 via Android
|
7
emeab OP @AngryPanda 我就是按照这个做的 现在正常了 redis 锁比事务快了一倍 thx
|