Redis「4」Redis 在秒杀系统中的应用
01-过程分析
将秒杀过程分为三个阶段:秒杀活动开始前,秒杀活动进行中,秒杀活动结束后
开始前,用户的操作特点是:不断刷新商品详情页,这会导致详情页的瞬时请求量剧增。此时的解决方案包括:页面静态化,CDN 加速
进行中,用户的操作特点是:大量用户点击商品详情页上的秒杀按钮,会产生大量的并发请求查询库存。一旦某个请求查询到有库存,紧接着系统就会进行库存扣减。然后,系统会生成实际订单,并进行后续处理,例如订单支付和物流服务。如果请求查不到库存,就会返回。用户通常会继续点击秒杀按钮,继续查询库存。此阶段可以抽象为三个步骤:库存查验、库存扣减和订单处理。此时的操作特点是,瞬间高并发,读多写少。
02-应对方案
02.1-页面静态化
将对商品详情页信息等进行静态化处理,用户浏览商品等活动并不会请求到服务端。等秒杀活动开始后,点击秒杀按钮,才会发送请求的到服务端。
02.2-CDN 加速
使用内容分发网络 CDN 加速,可以优化不同地域位置的用户访问静态资源的速度。
02.3-秒杀按钮
未开始时,秒杀按钮一般会置灰处理,一般实现原理是 js + 随机值:活动开始前 js 标志为 false,意为不可点击,活动开始后,标志为 true,意为允许点击。随机值是为了保证 CDN 不会缓存 js,用户每次都能拿到最新的 js。
02.4-瞬间高并发
将库存信息维护在 Redis 中。可使用哈希表结构存储,例如:
避免缓存击穿,可使用缓存预热技术,将秒杀商品的库存信息提前加载到 Redis 中。
库存查询和库存扣减可以在 Redis 中实现。但现成的 Redis 命令并无法做到查询和扣减在原子操作中完成,可以使用 Lua 脚本实现。
02.5-读多写少
订单生成涉及的业务操作比较复杂,主要表现在关联的表比较多,而且必须在事务中完成,所以放在数据库层实现。
库存扣减完成到订单处理,一般会使用异步的设计。在设计时,通过增加消息队列,可以实现订单支付失败、超时取消等功能。不过,引入消费队列同样增加了系统的复杂性,需要同时考虑消息丢失、消息重复消费、垃圾消息等问题。
[1] 36-Redis支撑秒杀场景的关键技术和实践都有哪些?
[2] 面试必考:秒杀系统要如何设计?
版权声明: 本文为 InfoQ 作者【Samson】的原创文章。
原文链接:【http://xie.infoq.cn/article/aff2de67f4e76e7a9aaa92a67】。文章转载请联系作者。
评论