• 秒杀设计


      ---- 个人设计,未经实践,欢迎指正。

    场景
    预估请求量:1kw,商品:gbjd,库存:50。

    server数量:10。
    server实现(queryCount + stock in redis)
    1:限流
    limit
    初始为5-10,limit大时,尽量在有人取消时,第一次进来其他用户能秒杀到。

    一次处理后,当库存减为0时,可将limit减为1,如果有人取消订单,再来的请求可进来处理。


    queryCount
    AtomicInteger/Semaphore,记录当前正在处理的请求量,当queryCount等于limit时,再来的请求直接拒绝。

    2:库存
    redis中记录stock = 50,当请求通过限流后,如果stock <= 0,则秒杀失败。
    如果stock > 0,则执行decr stock,当返回值 >= 0 时,去myslq减库存。
    update product set stock = stock - 1 where sku = 'gbjd';
    (因已通过redis decr,mysql不用再判断old stock)。
    当返回值 < 0 时,执行incr stock还原库存,并返回秒杀失败。

    3:取消订单
    取消订单,mysql stock + 1,redis中incr stock。
    通过限流的用户,通过redis decr stock后,下单去mysql减库存。

    4:失败

    减库存时,如果mysql减库存失败,重试后,仍失败,redis incr stock,秒杀失败。

  • 相关阅读:
    多屏共享
    md5-linux_shell
    2017年会所得
    linux无线网络配置_转
    (转)台式机华硕主板双显卡切换,怎么舒服怎么来
    Apache FtpServer 实现文件的上传和下载
    (转载)Windows 上搭建Apache FtpServer
    Eclipse常用设置
    博客园文章样式修改
    黑马公社学习
  • 原文地址:https://www.cnblogs.com/vsop/p/12055954.html
Copyright © 2020-2023  润新知