Redis 支撑秒杀场景的关键技术和实践都有哪些?
创始人
2024-05-09 08:09:54
0

文章目录

  • 秒杀场景的负载特征对支撑系统的要求
  • Redis 可以在秒杀场景的哪些环节发挥作用?
    • 秒杀前
    • 秒杀中
    • 秒杀后
  • Redis 的哪些方法可以支撑秒杀场景?
    • 基于原子操作支撑秒杀场景
    • 基于分布式锁来支撑秒杀场景

秒杀是一个非常典型的活动场景,比如,在双 11、618 等电商促销活动中,都会有秒杀场景。秒杀场景的业务特点是限时限量,业务系统要处理瞬时的大量高并发请求,而 Redis 就经常被用来支撑秒杀活动。

不过,秒杀场景包含了多个环节,可以分成秒杀前、秒杀中和秒杀后三个阶段,每个阶段的请求处理需求并不相同,Redis 并不能支撑秒杀场景的每一个环节。

秒杀场景的负载特征对支撑系统的要求

第一个特征是瞬时并发访问量非常高。

一般数据库的并发访问量在千级别,而 Redis 的并发访问量在万级别,甚至更高。

第二个特征是读多写少

Redis 可以在秒杀场景的哪些环节发挥作用?

如果将秒杀分为三个阶段,分别是秒杀前,秒杀中和秒杀后

秒杀前

秒杀前一般都是读操作,比如读取商品页信息。秒杀前可以将页面元素静态化,然后使用CDN或是浏览器把这些静态化的元素缓存起来。访问的时候直接访问缓存,这样做可以减轻秒杀前对服务器的冲击。

秒杀中

此时,大量用户点击商品详情页上的秒杀按钮,会产生大量的并发请求查询库存。一旦某个请求查询到有库存,紧接着系统就会进行库存扣减。然后,系统会生成实际订单,并进行后续处理,例如订单支付和物流服务。如果请求查不到库存,就会返回。用户通常会继续点击秒杀按钮,继续查询库存。

简单来说,这个阶段无非就是三个简单操作,库存查验,扣库存,订单处理。

而这三个操作中压力最大的就是库存查验。因为扣库存和订单处理这些操作都是抢到商品的用户,秒杀用户量肯定是少的。

注意:为了避免查验库存查到旧值,查验库存和扣减库存这两个操作需要保证原子性。而处理订单这个环节涉及到多张表,操作比较繁琐,这个时候我们可以使用消息队列等技术来进行处理。

秒杀后

在这个阶段仍有少部分人在刷新商品页,也就是查验库存,这部分人在等之前抢到商品但是取消订单或者是没有支付系统自动取消的这部分人的库存。但是这个阶段人数肯定很少了,服务器一般能够支撑的住。

下面来重点说秒杀中这部分

Redis 的哪些方法可以支撑秒杀场景?

基于原子操作支撑秒杀场景

查验库存和扣减库存这两个操作需要保证原子性。怎么保证这两个操作的原子性呢?

由于涉及到又查又减的操作,Redis 中没有提供单命令与之相关的单命令操作。

此时我们可以借助 Lua 脚本来完成这一需求。Lua 脚本可以保证原子性。

有了 Lua 脚本后,我们就可以在 Redis 客户端,使用 EVAL 命令来执行这个脚本了。

其实还有另一种技术,是使用分布式锁来解决这一需求。

基于分布式锁来支撑秒杀场景

使用分布式锁的具体做法就是:先让 Redis 客户端向 Redis 申请分布式锁,只有拿到锁的客户端才能够对库存进行查验库存和扣减库存的操作。这样一来,大量的请求就会在竞争分布式锁的时候被过滤掉(截流)。而且,库存查验和扣减也不用使用原子操作了,因为多个并发客户端只有一个客户端能够拿到锁,已经保证了客户端并发访问的互斥性。

注意:使用分布式锁要注意因为一些特殊原因没有及时释放锁的这样一个 case。因为没有一旦客户端因为一些特殊原因,比如对 共享资源 也就是库存处理的时候出现bug导致没有及时释放锁,会导致其他客户端也拿不到锁,谁都拿不到锁,那么谁都别想处理共享资源了。

解决办法:给 锁变量 设置一个过期的时间就ok了!

相关内容

热门资讯

MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
操作系统面试题(史上最全、持续... 尼恩面试宝典专题40:操作系统面试题(史上最全、持续更新)...
Android---Banne... 轮播图是一种很常见的UI。Banner框架能够帮助我们快速开发,完成首页轮播图效果的需...
python -- PyQt5... 控件2 本章我们继续介绍PyQt5控件。这次的有 QPixmap , QLineEdi...
Mysql SQL优化跟踪来看... 背景 使用索引字段进行筛选数据时,explain查询语句发现MySQL居然没有使用索...
UG 6.0软件安装教程 UG 6.0软件安装教程 软件简介: UG 6.0是目前网络最好用、使用最为广泛的大型...
HTML静态网页作业——关于我... 家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、ma...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
NoSQL数据库之Redis2 Redis 事务 事务的基础概念 关于事务最常见的例子就是银行转账,A 账户给 B 账...
Spring Security... 前言 在 Spring Security 中,默认的登陆方式是以表单形式进行提交参数的...