# SecKill **Repository Path**: nieps/sec-kill ## Basic Information - **Project Name**: SecKill - **Description**: 秒杀 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-09-16 - **Last Updated**: 2025-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: 秒杀 ## README # 秒杀 ## 功能 * 秒杀的商品缓存 > 考虑到的问题: > > 1. 对商品提前预热 > > 2. 假如访问的商品 缓存不存在 使用布隆过滤器,判断商品是否存在,如果存在查数据库缓存(使用分布式锁),如果不存在 返回失败 > > > 1. 缓存穿透 为了避免 ,查询数据库时不存在缓存一个空对象 > > 3. 如果商品存在 过期 了 使用分布式锁 查询数据库 * 秒杀按钮 > 限制: > > 1. 活动未开始 不能点击 > 2. 活到倒计时 > 3. 防抖处理 (防止用户多次点击 ) > 4. 请求发送完,按钮置灰 ,不允许再发送请求 * 预减库存 > 关于库存: > > 1. redis 预减库存 > 2. 生成订单时 锁定库存 > 3. 支付成功后,扣减库存 > 4. 支付失败或取消 还原库存 (锁定库存还原,redis库存还原) > > 问题: > > 1. 防止超卖 (lua脚本) * MQ 异步生成订单 > 保存消息的可靠性: > > 1. 消息正确的投递到mq服务器 发布确认(异步发布确认) > 2. 消息的的持久化 (队列 消息 持久化 ) > 3. 消费者 消费消息 不丢失 手动应答 > > 保存消息不被重复消费:同一个用户 同一个商品 只能产生一个订单 > > 生成订单数据,冻结(锁定)库存 * 订单1分钟未支付 自动取消 还原库存 * 限流 根据用户id \ip mac 用redis实现 * 支付成功 扣减库存 (实际库存-1 冻结库存-1) ## 数据库设计 商品表: 基本信息 库存(实际库存100、可用库存98、锁定库存2) 订单: 订单状态 、订单金额 商品。。。 两个事务: A: v=1 执行更新 : 新的版本号+1 条件是数据库的版本号=1 数据库版本号变成2 B v=1 ​ 执行更新 : 新的版本号+1 条件是数据库的版本号!=1 更新失败