redis之如何支持秒杀场景
写在前面
本文一起看下Redis在秒杀场景中的应用。
1:秒杀都有哪些阶段
redis并非在秒杀的所有阶段都需要使用到,为了更好的了解redis在秒杀场景中的应用,我们先来看下秒杀的不同阶段,基本可以分为秒杀前,秒杀进行时,秒杀后。
1.1:秒杀前
秒杀前用户的动作就是在自己想要购买的页面等待倒计时,并且不断的刷新页面,等待倒计时变为购买
,此时的请求量会比较大,所以我们需要做的就是尽量将一些静态资源使用CDN缓存,比如商品的图片等,或者是客户端本地做缓存(这种可能是最优的,但是对客户端要求就增加了)
。因此,这一阶段完全使用不到Redis。
1.2:秒杀进行时
当倒计时变为可点击的购买按钮时,用户点击购买按钮,后台的逻辑如下:
1:判断库存是否充足,如果充足进入2,否则进入3
2:下单
3:提示库存不足
其中1
并发量是比较大的,因为大家同时点,对速度的要求很高,用户对时延非常敏感,而判断库存是否充足其实就是判断库存量是否大于0,这里redis的高并发的读写特点就可以派上用场了,具体做法是使用一个哈希结构来保存总库存量,以及当前的订单量,如下:
判断过程可能如下图:
这里判断库存是否充足,以及将订单数+1的逻辑必须是原子的,不然可能出现超卖情况的发生。而想要保证原子性,可以是单命令操作,也可以使用lua脚本,这里明显只能使用lua脚本,如下:
这里的k是用户的购买数量。
判断库存充足后,接着就是下单操作了,这个下单动作是使用redis来做还是适用后端的关系型数据来做呢,答案是后端的关系型数据库,原因如下:
1:订单和后续的支付,发货等关系密切,而这些信息的关系维护都是在数据库表中的
2:订单生成的压力不大,可以在后端完成
3:用户对时延不敏感
为了增加响应用户的速度(有库存,且库存扣减成功,则代表用户具备了购买商品的资格,订单可后续生成)
,这个生成订单的过程可以通过基于消息队列的异步方式来完成,即判断库存充足后,直接向消息队列发送一个生产订单的消息就行了,之后用户的支付,发货等过程就都可以依赖于后端服务了。
1.3:秒杀后
秒杀后,可能还有部分用户等待别人退款所以还在不断刷新页面,已下订单的用户支付超时等情况,但这些并发量都不大,也用不到redis,使用后端服务来处理就可以了,但是还是需要维护redis中的订单数量,不然就会出现数据不一致了,这个压力也不大。
2:可能有哪些问题
2.1:redis挂了怎么办?
为了保证redis的高可用,可以使用redis哨兵 来配置读写分离的集群,当主节点宕机后,自动执行主从切换,但是这有个问题需要注意,就是从节点可能是存在延迟的,即订单数量可能是实际订单数量要少的,可能出现超卖,这个时候可以从数据库中同步一次订单数量,保证订单数量的正确性。
当然还有很多其它的细节问题,需要我们在实际场景中充分考虑,尽量做到完美。
写在后面
小结
秒杀其实就只需要解决判断当前库存是否满足客户订单量就行了,因为该过程用户会同时点击,并发量最大,因此该过程需要用到Redis,剩余的下单,发货等流程,压力都不会很大,直接使用关系型数据库就行了。
redis之如何支持秒杀场景相关推荐
- kafka mysql秒杀框架_一次模拟简单秒杀场景的实践 Docker Node.js Kafka Redis MySQL...
秒杀活动可以说在互联网上随处可见,从12306抢票,到聚划算抢购,我们生活的方方面面都可以看到秒杀的身影.秒杀的架构设计也是对于一个架构师架构设计能力的一次考验.本文的目的并不在于提供一个可以直接落地 ...
- 使用Redis搭建电商秒杀系统
作者:小热爱 来源:https://juejin.cn/post/6955372476649963556 秒杀活动是绝大部分电商选择的低价促销.推广品牌的方式.不仅可以给平台带来用户量,还可以提高平台 ...
- Java程序猿笔记——基于redis分布式锁实现“秒杀”
最近在项目中遇到了类似"秒杀"的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓"秒杀"的基本思路. 业务场景 所谓秒杀,从业务角度看,是短时 ...
- “百变”Redis带你见识不同场景下的产品技术架构
2018飞天技术汇24期-云数据库Redis产品发布会,由阿里云数据库技术组技术专家王欢.怀听.梁盼分别带来以"Redis全球多活产品"."Redis混合存储产品&quo ...
- 秒杀场景的九个细节,细思极恐!
往期热门文章:1.放弃MyBatis!我选择 JDBCTemplate! 2.生成订单30分钟未支付,则自动取消,该怎么实现? 3.Lombok代码"亚健康"元凶? 4.IDEA的 ...
- Redis分布式锁实现秒杀
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010359884/article/details/50310387 最近在项目中遇到了类似&quo ...
- 从Redis List的各种使用场景来深刻理解它
文章目录 一. 任务队列:由于Redis List支持阻塞式弹出元素,并且支持多个客户端同时阻塞在同一个List上,因此可以用来实现任务队列.例如,将需要异步执行的任务存储在一个List中,多个工作线 ...
- Redis五大数据类型与使用场景汇总!!(含完整实战案例,建议收藏)
本文全面讲述了Redis的五大数据类型和使用场景,含完整实战案例,强烈建议收藏!! 大家好,我是冰河~~ 最近面试跳槽的小伙伴有点多,给我反馈的面试情况更是千差万别,不过很多小伙伴反馈说:面试中的大部 ...
- 秒杀场景下超卖问题解决方案
秒杀超卖现象:在高并发下,多个线程并发更新库存,导致库存为负的情况. 我搜集了一些资料,整理了一下,秒杀可选方案主要有以下三种: 1.超卖原因 一个简单的订单表 create table orders ...
最新文章
- mysql 和 mongo db 语法对比
- 使用Toast进行用户提醒(转)
- 耿建超英语语法---被动语态
- AT5661-[AGC040C]Neither AB nor BA【模型转换】
- 苹果app商品定价_App Store 即将进行价格调整
- Python出入库简洁系统
- 8个顶级云安全解决方案
- scala安装与配置
- 3D建模软件快捷键操作:3DMAX篇(第二期)
- android在wifi和4G网络都可以使用的情况下,设置每次请求使用的网络类型
- 怎么用计算机打游戏视频,如何录制电脑上正在玩的游戏视频
- 2020武理计专上岸,拿下一等奖学金的曲折经历分享
- oracle 取农历函数,完善SQL农历转换函数
- 正负号 substr java_实战LeetCode 系列(一) (题目+解析)
- python推箱子游戏顶层设计子层设计_python实现推箱子游戏
- プログラム・ライブラリ
- ESP8266 NodeMCU:ESP-NOW Web 服务器传感器仪表板(ESP-NOW + Wi-Fi)
- Red Team后漏洞利用秘籍:如何使用C#语言实现系统调用
- PowerDesigner16.5反向工程获取Oracle11g数据表结构遇到的问题及解决方法
- 磊科nw705p虚拟服务器设置,教你如何设置磊科nw705p无线路由器的详细步骤【图文】...