秒杀架构改良

本文针对高并发秒杀系统的原有设计方案进行改进,摒弃乐观锁和消息队列,提出一种新的库存控制方案,通过Redis原子操作确保库存准确,并优化数据库更新逻辑减少资源浪费。

刚刚看了一篇比较好的文章,指导怎么构建秒杀系统,看完之后发现有几点可以改良,暂记下来。原文请移步: 点击打开链接

1.去掉乐观锁

由于秒杀活动并发量极高,乐观锁大几率失败,所以这里不考虑乐观锁

2.不使用消息队列

由于设置了限流,实际上系统流量有限,无须使用消息队列。


基于以上,我对秒杀流程进行了改良,思路如下

1.首次访问时,在redis上读取商品的库存,有两种可能: 1.没有读取到库存数量,那只有一种可能,就是秒杀活动刚刚开始。此时需加分布式锁,重新从redis读取库存数,然后把商品库存数缓存到redis,解锁。这里加锁后需重新读取是因为可能有多线程重入读取商品的库存,如果第一个线程已经缓存了商品库存,第二个线程及以后不能重新缓存库存!2.读取到库存为0,秒杀结束,不为0,即还有库存,执行下一步

2.调用redis decr命令使商品库存-1,然后检查命令返回值,返回小于0,即已经没有库存,马上返回失败,返回M (此时M>0),下一步。(由于redis单线程的特点。此处redis decr命令可以保证原子性)

3.增加秒杀订单

4.redis get重新获取商品库存数N,如果最新商品库存数小于M,则不更新数据库(N<M表示刚刚已经有人下单了,redis库存已经减少了,此时更新数据库中商品库存没有意义,比如总库存为10,库存M=9,最新库存值N=8,此时更新商品库存为9没有意义,因为最后始终会更新为8)。如果M=N,加写锁,更新数据库中库存为N,解锁。

伪代码

//加锁    /*在这里加锁是因为:如果在判断M==N之后加锁,另一线程改变了N的值为X(如X=N-1),并且数据库更新最新值为X,之后当前线程继续执行sql更新最新值为N的话会覆盖掉最新的更新!这样会导致修改丢失了,虽然几率极小,但是不可忽略,且此处逻辑简单,加锁对性能影响不大*/

//获取最新库存N

if (M==N){ 

    //执行sql更新

} else{//M>N,执行第四步之前,库存数减少了,此时不更新数据库,什么也不执行

}

//解锁


### 3 系统需求分析 #### 3.1 功能需求 ##### 3.1.1 用户功能 用户功能模块是系统的核心部分,旨在为旅游者提供全流程的服务支持。通过用例图(图3.1)可以清晰地展示用户与系统之间的交互关系。 **用户注册与登录** - 支持邮箱验证和手机号绑定双重认证机制 - 采用SHA-256加盐哈希算法存储密码 - 集成图形验证码和短信验证码防止恶意注册 **景点浏览与交互** - 多条件复合查询:支持按地理位置、票价区间、景点评分等多维度筛选 - 智能排序:默认按热度排序,可选最新/最优惠等排序方式 - 互动功能: - 收藏夹管理(图3.2展示收藏用例) - 评分评论(支持文字+图片评价) - 分享至社交平台 **订单管理** - 状态机设计:包含待支付/已支付/已取消/已完成等状态 - 支付集成:支持支付宝、微信支付等多种方式 - 退款流程:自动化审核与人工复核相结合 图3.1 用户功能用例图 (此处应插入用户角色与系统功能的用例关系图示) ##### 3.1.2 管理员功能 管理员功能模块侧重系统运维与数据管理,其用例图如图3.3所示。 **数据管理中心** - 批量操作:支持CSV格式数据导入导出 - 审核机制:用户提交的景点信息需经管理员审核 - 数据看板:实时显示系统关键指标(UV、PV、转化率等) **权限管理系统** - 角色分级:超级管理员/内容管理员/客服人员 - 操作日志:记录管理员所有敏感操作 - 权限粒度控制:精确到按钮级别的权限分配 **智能分析模块** - 热力图分析:展示景点访问时空分布 - 用户行为分析:通过埋点数据计算停留时长等指标 - 自动报表:每日/周/月运营报告自动生成 图3.3 管理员功能用例图 (此处应插入管理员角色与后台功能的交互图示) #### 3.2 性能需求 ##### 3.2.1 响应速度 - 核心页面加载时间≤1.5s(包含首屏渲染) - 搜索接口响应时间≤800ms(百万级数据量) - 支付回调处理时间≤300ms ##### 3.2.2 并发处理 - 支持≥5000TPS的订单创建峰值 - 秒杀场景下库存校验耗时≤50ms - 采用分布式锁处理高并发写操作 ##### 3.2.3 缓存策略 - 多级缓存架构: - 本地缓存(Caffeine):存储用户会话 - 分布式缓存(Redis):缓存热门景点数据 - CDN加速:静态资源分发 ##### 3.2.4 容灾能力 - 数据库主从切换时间≤30s - 每日自动备份且支持时间点恢复 - 关键服务有熔断降级机制 ### 4 系统设计 #### 4.1 总体设计 ##### 4.1.1 系统架构 采用改良版的三层架构(图4.1),具有以下特点: **表现层** - 基于Vue3的组件化开发 - 自适应布局支持PC/移动双端 - WebSocket实现实时通知 **业务层** - Spring Cloud微服务划分: - 用户服务 - 订单服务 - 支付服务 - 推荐服务 - 统一网关处理鉴权/限流 **数据层** - 主从复制集群(1主3从) - 读写分离配置 - 冷热数据分离存储 图4.1 系统架构图 (此处应包含架构分层与组件交互示意图) ##### 4.1.2 技术栈增强说明 **后端技术栈** - 容器化:Docker+K8s部署 - 消息队列:RocketMQ处理异步任务 - 监控体系:Prometheus+Grafana **前端技术栈** - 状态管理:Pinia替代Vuex - 构建工具:Vite替代Webpack - 可视化:Apache ECharts 5.0 **数据库优化** - 索引策略: - 联合索引:为高频查询字段建立覆盖索引 - 自适应哈希索引:针对等值查询优化 - 分库分表:订单表按用户ID哈希分片 #### 4.1.3 数据库详细设计 **E-R图关键关系** - 用户-订单:一对多关系 - 景点-标签:多对多关系(通过attraction_tag关联表实现) - 酒店-房型:一对多关系 图4.2 数据库E-R图 (此处应展示完整的实体关系示意图) **扩展表结构设计** 表4.5 收藏表(user_favorite) | 字段名 | 类型 | 约束 | 说明 | |--------|------|------|------| | id | BIGINT | 主键 | 自增ID | | user_id | INT | 外键 | 关联用户 | | resource_type | TINYINT | 非空 | 1-景点/2-酒店 | | resource_id | INT | 非空 | 资源ID | | created_at | TIMESTAMP | 默认当前时间 | 创建时间 | 表4.6 景点标签关联表(attraction_tag) | 字段名 | 类型 | 约束 | 说明 | |--------|------|------|------| | id | BIGINT | 主键 | 关联ID | | attraction_id | INT | 外键 | 景点ID | | tag_id | INT | 外键 | 标签ID | | weight | DECIMAL(3,2) | | 权重分数 | 表4.7 操作日志表(admin_log) | 字段名 | 类型 | 约束 | 说明 | |--------|------|------|------| | log_id | BIGINT | 主键 | 日志ID | | admin_id | INT | 外键 | 操作人 | | operation | VARCHAR(50) | 非空 | 操作类型 | | params | TEXT | | 请求参数 | | ip_address | VARCHAR(50) | | 操作IP | | create_time | DATETIME | | 操作时间 | #### 4.2 功能模块深度设计 ##### 4.2.1 智能推荐模块 采用混合推荐策略: 1. 基于内容的推荐:计算景点标签余弦相似度 2. 协同过滤:使用ALS算法处理用户-景点矩阵 3. 实时推荐:通过Flink处理用户实时行为数据 ##### 4.2.2 支付系统设计 - 状态机设计: ```mermaid stateDiagram [*] --> 待支付 待支付 --> 已支付: 支付成功 待支付 --> 已取消: 用户取消 已支付 --> 已退款: 发起退款 已支付 --> 已完成: 核销使用 ``` - 防重设计: - 订单号使用雪花算法生成 - 支付流水号全局唯一校验 ##### 4.2.3 安全控制 - 接口安全: - HTTPS传输加密 - 敏感数据脱敏处理 - 参数签名验证 - 风控策略: - 异地登录检测 - 高频操作限制 - 敏感操作二次认证 以上设计通过完整的流程图、状态转换图和数据库关系图进行可视化呈现,确保系统设计方案的完整性和可实施性。在具体实现时,将根据实际测试数据进行进一步的调优和迭代。请你将以上内容重新加工补充以下,包括生成相关数据图表供参考
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值