再问秒杀锁问题 - V2EX
cevincheung
V2EX    Redis

再问秒杀锁问题

  •  
  •   cevincheung
    cevin Sep 4, 2017 7003 views
    This topic created in 3178 days ago, the information mentioned may be changed or developed.

    现成的术解决方案太多,redis 的并发性能真的是没得说,关键是想问问都是怎么处理数据同步的问题的。

    发布秒杀活动,发布成功后就直接入 redis ?

    if (insert ok) redis.set('ms:itemid',stock) ?

    入 redis 失败了呢? redis 挂掉这阶段的数据没保存呢(还没来得及 fsync)?

    活动结束后 怎么删除(不能用 setnx 的场景,没过期时间,售完算完)?

    if(decr('ms:itemid')<0) del('ms:itmeid') ?

    怎么及时的删除脏数据?

    大半夜睡不着不知道自己在纠结什么。 :(

    22 replies    2018-05-10 20:44:05 +08:00
    hareandlion
        1
    hareandlion  
       Sep 4, 2017 via iPhone
    额,启用热备,一个备份不够就多上几个?剩下的就是预防成本高于实际需求的小概率情况了吧?
    jalja27
        2
    jalja27  
       Sep 4, 2017 via Android
    ‘ 1
    linpf
        3
    linpf  
       Sep 4, 2017   9
    讲道理,业务上改一改规则的话,没必要完全实现秒杀,假设同一秒有 1 万个用户抢购 100 件商品,nginx 直接按照 97%的几率抛弃请求,返回“抢购失败,还有机会,请重新抢购”,省下大约 300 个请求,直接用 mysql 就行了。这样购买时间都是同一秒的请求,用户也不知道他到底在这 1 秒之内的顺序。对活动方来说,活动效果也实现了。毕竟运气也是实力的一部分。
    esile
        4
    esile  
       Sep 4, 2017 via iPhone
    @linpf 666 啊 先随机排除,然后在进行计算
    xrlin
        5
    xrlin  
       Sep 4, 2017
    @linpf 这想法很不错。
    jyz19880823
        6
    jyz19880823  
       Sep 4, 2017
    @linpf 666
    TheLamb
        7
    TheLamb  
       Sep 4, 2017
    @linpf 很 6 的想法
    t333st
        8
    t333st  
       Sep 4, 2017
    @linpf 套路深,学习了
    cevincheung
        9
    cevincheung  
    OP
       Sep 4, 2017
    @linpf #3 23333
    cevincheung
        10
    cevincheung  
    OP
       Sep 4, 2017
    @linpf #3 就直接 select for update 了?
    paragon
        11
    paragon  
       Sep 4, 2017
    前面加验证码 后面提交验证的验证码就丢了
    kamushin
        12
    kamushin  
       Sep 4, 2017
    @linpf 然后出现一件商品非常冷门, 很少有人愿意抢, 唯一一个客户需要下单 33 次才能购买到. 这个用户体验炸裂
    MrFireAwayH
        13
    MrFireAwayH  
       Sep 4, 2017
    @kamushin #12 虽然不是很懂 但是我觉得判断一下并发请求数目后再进行 97%概率抛弃是能做到的吧
    yexiangyang
        14
    yexiangyang  
       Sep 4, 2017
    1.if(decr('ms:itemid')<0) del('ms:itmeid') ?
    可以修改为
    if(decr('ms:itemid')=0) del('ms:itmeid')
    2.入 redis 失败了呢? redis 挂掉这阶段的数据没保存呢(还没来得及 fsync)?
    建议采用 sentinel 模式
    挂掉后故障转移,时间不会很久,期间可以业务失败
    caijihui11
        15
    caijihui11  
       Sep 4, 2017
    @linpf 这个实现 6,但我们也要维护参与活动的公平性,不能以运气来搞
    qiyuey
        16
    qiyuey  
       Sep 4, 2017
    @caijihui11 随机难道不公平吗
    linpf
        17
    linpf  
       Sep 5, 2017
    @kamushin 没看到返回的文字吗“抢购失败,还有机会,请重新抢购”,也就是可以再点啊。
    linpf
        18
    linpf  
       Sep 5, 2017
    @caijihui11 这就要看为了这点公平性,提升的成本能不能接受了
    linpf
        19
    linpf  
       Sep 5, 2017
    @caijihui11 而且每个用户访问请求接口,网络环境的不同也会存在延迟也有几毫秒到几秒的随机,其实请求到达服务器的顺序本身就已经不是按照点按钮的顺序了。
    tausi0661
        20
    tausi0661  
       Sep 5, 2017
    @qiyuey 吹毛求疵的说, "秒杀"的意思是"比谁快". 而随机意味着"我比你快, 但我被随机掉了"
    (3#666, 我也打算这么实现...)
    zhengwenk
        21
    zhengwenk  
       Sep 5, 2017
    @caijihui11 其实也可以把请求入队列,只消费前 300 个,之后的请求都抛弃掉。
    1cming
        22
    1cming  
       May 10, 2018
    3#666
    About     Help     Advertise     Blog     API     FAQ     Solana     1163 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 74ms UTC 23:43 PVG 07:43 LAX 16:43 JFK 19:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86