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

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

  •  
  •   emeab · 2019-08-12 19:55:07 +08:00 · 2044 次点击
    这是一个创建于 1710 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    但是锁释放不应该是在订单生成后才释放? 不然你库存回滚了 但是下一个获取锁的人读到的数据是脏数据 /
    AngryPanda
        6
    AngryPanda  
       2019-08-12 22:09:17 +08:00 via Android
    emeab
        7
    emeab  
    OP
       2019-08-13 00:20:03 +08:00
    @AngryPanda 我就是按照这个做的 现在正常了 redis 锁比事务快了一倍 thx
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4994 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:41 · PVG 17:41 · LAX 02:41 · JFK 05:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.