秒杀活动优化点
优化缓存设计以减少交互次数
例如:使用hmget一次性读取需要的数据;将相关数据打包在一起可以通过单个key访问返回
针对秒杀活动指定业务状态枚举来表示正常逻辑错误
减少使用异常控制逻辑分支.(找不到子活动,活动没开始,活动结束,用户参与过)这些状态,可以直接用状态枚举返回.
某些业务逻辑不相关的操作可以异步处理
- 记录活动监控数据这些,异步处理失败也不会影响正常业务,监控数据误差不大也不影响;
- 异步在缓存中标记用户已中奖,标记失败仅仅会使用户多访问一次数据库.
- 扣除库存以外的其他操作,例如发券,扣除库存成功后可以直接提示用户已中奖(抢购成功),稍后在个人中心查看.然后异步处理奖品(商品)发放.
使用异步排队机制,控制对数据库的并发操作.
将秒杀参与接口拆分成两个.
- 提交参与请求,可能直接返回结果,也可能返回事务id表示处理进入队列,结果需要异步查询.
- 根据事务id查询处理结果.需要隔断时间周期调用.超过约定时间视为处理失败.
Redis存储数据结构
- 用户入队标记(参与和结果)
- 活动信息(起止时间,库存标记)—保存为hash,以便于可以使用hmget一次读取.