# seckill **Repository Path**: coderporter/seckill ## Basic Information - **Project Name**: seckill - **Description**: 秒杀项目 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-11-22 - **Last Updated**: 2024-10-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于SpringBoot、Redis和RabbitMQ的秒杀系统 > 系统的重点在秒杀,所以前端的实现比较简陋,大致可以演示功能就行,关于秒杀的逻辑将作出详细的阐述。 对于秒杀功能的实现主要有以下几个方面: 1. 秒杀功能的简单实现 2. 压力测试 3. 页面优化 4. 服务优化 5. 接口安全 ## 超卖问题 遇到的问题:压测的时候会出现超卖的情况,即库存变为负数。 解决方法: - 减库存时判断库存是否足够 - 解决同一用户同时秒杀多件商品,可以通过数据库建立唯一索引避免,用户id+商品id的唯一索引 - 将秒杀订单信息存入Redis,方便判断是否重复抢购时进行查询 ## 接口优化 思路:减少数据库访问 1. 系统初始化,把商品库存数量加载到Redis 2. 收到请求,Redis预减库存。库存不足,直接返回。否则进入第3步 3. 请求入队,立即返回排队中 4. 请求出队,生成订单,减少库存 5. 客户端轮询,是否秒杀成功 ## 安全优化 1. 秒杀接口地址隐藏:为了防止有人提前知道秒杀接口的地址制定脚本去请求服务,可以将秒杀接口的地址进行隐藏,在秒杀开始之前,先去请求接口获取秒杀地址。 2. 图形验证码:点击秒杀开始前,先输入验证码,既可以防脚本又可以分散用户的请求 ## 接口限流 为了防止恶意请求,可以进行接口限流,比如一个用户限制在多少秒内最多请求多少次,限流算法:计数器限流,令牌桶限流