# shoppingseckill **Repository Path**: interview_44/shoppingseckill ## Basic Information - **Project Name**: shoppingseckill - **Description**: 百亿电商秒杀设计(初稿) - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-03-14 - **Last Updated**: 2024-08-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # shoppingseckill #### 百亿电商秒杀设计 专门针对秒杀场景的设计 -[1、秒杀商品发布](#1秒伤商品发布) -[2、开始秒杀](#2开始秒杀网) -[3、雪花算法](#3雪花算法) -[4、redis分段锁](#4redis分段锁) -[5、nginx限流](#5nginx限流) ### 1、秒杀商品发布 ![](./picture/1-秒杀商品暴露.drawio.png) 发布 -> 初始化秒杀限流lua脚本 通过sku_id校验商品有效性 -> 分段库存:扣库存+下订单,同步并行:CompletableFuture+CountDownlatch redis分段锁 -> 把商品拆分成100个锁 -> 秒杀开启成功。 用户参与秒杀,此时,库存和sku都已经加载入redis。 用户才操作会触发令牌发放的lua脚本加入缓存。 再把用户id加入redis,防止重复参加。 ### 2、开始秒杀 ![](./picture/2-秒杀.drawio.png) 第一步:获取先去获取令牌 -> 通过user_id和exposedKey去获取令牌 调用redis+lua脚本,减库存,把令牌放到redis的hash结构 第二部:下单,令牌校验是否有效,查看之前用户参与秒杀,用户id是否在redis上有值 -> 异步提交创建订单 -> 获取锁锁住库存 -> 付款成功,库存扣减成功 ### 3、雪花算法 ![](./picture/3-雪花算法.drawio.png) 1、首位为0,即负数 2、41位为时间戳,左移22位 3、5位为机房+5为服务器,左一12位 4、毫秒内的时间错,累计 ### 4、redis分段锁 ![](./picture/4-redis分段锁.drawio.png) 1、数据库里面加上分段号 2、redis,sku加上分段号作为锁 3、秒杀,获取锁 -> 查库存 -> 扣减成功 -> 创建订单 ### 5、nginx限流 ![](./picture/5-nginx限流.drawio.png) 1、http -> limit_req_zone 限流配置 根据服务名限流 server限流 -> 每秒钟限流多少次 根据总存储ip限流 ip -> 每秒限流多少次 2、service -> limit_request 配置限流 根据用户ip限流 限制同一ip的访问此处 根据服务名限流 server限流 -> 每秒钟限流多少次 3、location -> 限流 -> 重定向 -> 降级页面 4、burst 可以配置缓存队列 5、nodelay 是否延时