写点什么

Redis「4」Redis 在秒杀系统中的应用

作者:Samson
  • 2022 年 5 月 15 日
  • 本文字数:917 字

    阅读完需:约 3 分钟

Redis「4」Redis 在秒杀系统中的应用

01-过程分析

将秒杀过程分为三个阶段:秒杀活动开始前,秒杀活动进行中,秒杀活动结束后

  1. 开始前,用户的操作特点是:不断刷新商品详情页,这会导致详情页的瞬时请求量剧增。此时的解决方案包括:页面静态化,CDN 加速

  2. 进行中,用户的操作特点是:大量用户点击商品详情页上的秒杀按钮,会产生大量的并发请求查询库存。一旦某个请求查询到有库存,紧接着系统就会进行库存扣减。然后,系统会生成实际订单,并进行后续处理,例如订单支付和物流服务。如果请求查不到库存,就会返回。用户通常会继续点击秒杀按钮,继续查询库存。此阶段可以抽象为三个步骤:库存查验、库存扣减和订单处理。此时的操作特点是,瞬间高并发,读多写少。

02-应对方案

02.1-页面静态化

将对商品详情页信息等进行静态化处理,用户浏览商品等活动并不会请求到服务端。等秒杀活动开始后,点击秒杀按钮,才会发送请求的到服务端。

02.2-CDN 加速

使用内容分发网络 CDN 加速,可以优化不同地域位置的用户访问静态资源的速度。

02.3-秒杀按钮

未开始时,秒杀按钮一般会置灰处理,一般实现原理是 js + 随机值:活动开始前 js 标志为 false,意为不可点击,活动开始后,标志为 true,意为允许点击。随机值是为了保证 CDN 不会缓存 js,用户每次都能拿到最新的 js。

02.4-瞬间高并发

将库存信息维护在 Redis 中。可使用哈希表结构存储,例如:


key: product:itemIDvalue: {total: N, ordered: M}
复制代码


避免缓存击穿,可使用缓存预热技术,将秒杀商品的库存信息提前加载到 Redis 中。


库存查询和库存扣减可以在 Redis 中实现。但现成的 Redis 命令并无法做到查询和扣减在原子操作中完成,可以使用 Lua 脚本实现。

02.5-读多写少

订单生成涉及的业务操作比较复杂,主要表现在关联的表比较多,而且必须在事务中完成,所以放在数据库层实现。


库存扣减完成到订单处理,一般会使用异步的设计。在设计时,通过增加消息队列,可以实现订单支付失败、超时取消等功能。不过,引入消费队列同样增加了系统的复杂性,需要同时考虑消息丢失、消息重复消费、垃圾消息等问题。


[1] 36-Redis支撑秒杀场景的关键技术和实践都有哪些?

[2] 面试必考:秒杀系统要如何设计?


Redis「3」持久化

Redis「2」缓存一致性与异常处理

Redis「1」流水线、事务、Lua 脚本

发布于: 刚刚阅读数: 4
用户头像

Samson

关注

还未添加个人签名 2019.07.22 加入

还未添加个人简介

评论

发布
暂无评论
Redis「4」Redis 在秒杀系统中的应用_学习笔记_Samson_InfoQ写作社区