Redis--秒杀系统分析需求

1. 秒杀系统业务分析

在这里插入图片描述

2. 秒杀系统结构分析

在这里插入图片描述
如图所示,第一层是前端拦截层、第二层是网关处理层、第三层是业务逻辑层、第四层是DB入库。在第三层中我们会用到Redis,这篇博客是秒杀系统中的Redis的应用场景,所以这篇博客主要讲解业务逻辑层。

2.1 网关处理层

简单讲一件网关处理层的实现,网关处理层主要处理后端流量数据的拦截,比如说我们有几十万的用户同时进行一个秒杀的功能,那么我们就会有这么多的用户的请求进来, 那么这么多的用户请求进来之后我们要进行一个拦截。

我们可以利用Redis的incr来控制流量拦截。
首先通过数据控制模块,提前将秒杀商品缓存到读写分离Redis,并设置秒杀开始标记如下:

"skuId_start" : 0  // 开始标记 初始值为0
"skuId_count" : 10000 // 商品库存总数 初始值为10000
"skuId_access" : 12000 // 接收抢购数 初始值为0

秒杀开始前,服务集群读取skuId_start为0,直接返回活动未开始。
数据控制模块将skuId_start改为1, 标志秒杀开始。
当接收下单数达到sku_count*1.2后,拦截所有请求,商品剩余数量为0

通过这些拦截之后进行流量放入再到业务逻辑层处理订单业务

2.2 业务处理层

到了业务处理层处理订单信息验, 订单信息校验失败直接返回,订单信息校验通过。进入第四层操作数据库。

利用Redis缓存加减库存扣量

skuId_booked : 10000  // 总数从0开始到10000 初始值设置为0  通过incr加减库存,返回抢购成功
  1. 校验当前用户是否已经买过这个商品
    需要存储用户的uid,将uid存入数据效率太低,存Redis value方式数据太大,存布隆过滤器性能高且数据量小
  2. 未购买的用户下单抢购商品
    先判断抢购的商品数量是否已经到达1万件 # redis.get(skuId_booked) < 10000
    如果未达到1万件,还有剩余商品,抢购成功。使用incr命令增加skuId_booked的值。 # redis.incr(skuId_booked)
    由于redis是单线程,为了保证两个任务的原子性,使用lua语言同时执行get命令和incr命令。

2.3 DB入库层

抢购成功使用消息队列异步执行将数据存入数据库中

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页