首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Coding
V2EX  ›  问与答

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

  •  
  •   emeab · 123 天前 · 959 次点击
    这是一个创建于 123 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    7 回复  |  直到 2019-08-13 00:20:03 +08:00
        1
    czzhengkw   123 天前
    秒杀场景,不要用锁,并发请求串行化(队列),可以通过多个进程去消费请求队列的方式提高性能
        2
    emeab   123 天前
    @czzhengkw 但是用队列 如何保证与客户端的沟通呢?
        3
    des   123 天前 via Android
    先不说该不该用锁,我估计你用法就是错误的,所以才和用事物一样
    库存-1 了,就应该解锁的,不要把这个-1 的操作也放到事物里了。失败了可以再加回去

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

    但是锁释放不应该是在订单生成后才释放? 不然你库存回滚了 但是下一个获取锁的人读到的数据是脏数据 /
        6
    AngryPanda   123 天前 via Android
        7
    emeab   123 天前
    @AngryPanda 我就是按照这个做的 现在正常了 redis 锁比事务快了一倍 thx
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2354 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 29ms · UTC 05:34 · PVG 13:34 · LAX 21:34 · JFK 00:34
    ♥ Do have faith in what you're doing.