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

关于某些秒杀的设计

  •  
  •   hytex · 2022-09-21 13:29:05 +08:00 · 1574 次点击
    这是一个创建于 554 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我一直有一个疑问,看过一些秒杀代码,类中都会有一个 hashmap 来存储当前某个产品的库存,进入方法的时候获取对应商品的库存,如果够的话就执行之后的代码,如果不够的话就去库或者 redis 继续取。伪代码如下

    
        private HashMap map  = new HashMap();
    
    	/**
        * 库存判断
        */
        public void preHandle(int id) {
            //判断 map 中的数量
            if(Integer.parseInt(map.get("id").toString())<1){
                //获取库中的数量,并 put 到当前的 map 中,假定 result 为库中获取到的数量
                int result = 10;
                //如果数量>0 ,则执行下单逻辑
                if(result>0){
                    order();
                }else {
                    //抛出库存不足的异常
                }
                
            }
            //执行下单逻辑
            order();
        }
    
        public void order(){
            //订单逻辑
        }
    

    那如果现在我有 3 台机器,其中两台中的 map 中的 id 为 1 的商品数量为 0 了,只有一台 map 中 id 为 1 的数量为 10 。我是如何确保对应访问的流量是对应到有余量的服务上的呢

    10 条回复    2022-09-21 20:43:38 +08:00
    7911364440
        1
    7911364440  
       2022-09-21 14:54:15 +08:00
    本地缓存只能在单机上用
    lmshl
        2
    lmshl  
       2022-09-21 15:02:24 +08:00   ❤️ 1
    鉴于秒杀系统的流量,没必要去平衡这点差异,还没等你把流量转发给有余量的进程上去,那点余量就已经被别人秒掉了。
    bootvue
        3
    bootvue  
       2022-09-21 15:03:30 +08:00
    分布式缓存 分布式锁
    lmshl
        4
    lmshl  
       2022-09-21 15:04:27 +08:00   ❤️ 1
    如果你真的对”正确答案“感兴趣的话,可以了解一下什么是《位置透明( Location Transparency )》 https://doc.akka.io/docs/akka/current/general/remoting.html

    它是分布式系统中的概念
    wolfie
        5
    wolfie  
       2022-09-21 15:04:54 +08:00   ❤️ 1
    没请求到 有库存的实例上,算用户倒霉。下一个。
    hytex
        6
    hytex  
    OP
       2022-09-21 15:09:06 +08:00
    @lmshl 明白你的意思了,确实…
    hytex
        7
    hytex  
    OP
       2022-09-21 15:09:36 +08:00
    @7911364440 单机、秒杀。 这两个词放在一起总感觉有点违和。
    wdwwtzy
        8
    wdwwtzy  
       2022-09-21 15:32:40 +08:00
    没懂,假设 3 台机器,真实库存是 100 ,那这个 map 存 100 还是 33 ? 100 的话那不就超卖了,33 的话还可以理解……
    oceanthe1h
        9
    oceanthe1h  
       2022-09-21 18:08:15 +08:00
    为 0 了不应该先去 Redis 里找吗,为什么要把流量路由走呢
    ailer
        10
    ailer  
       2022-09-21 20:43:38 +08:00 via Android
    这个 map 是减轻 Redis 压力的吧?难道不是一种缓存措施吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1668 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 16:46 · PVG 00:46 · LAX 09:46 · JFK 12:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.