写在前面

本文一起看下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之如何支持秒杀场景相关推荐

  1. kafka mysql秒杀框架_一次模拟简单秒杀场景的实践 Docker Node.js Kafka Redis MySQL...

    秒杀活动可以说在互联网上随处可见,从12306抢票,到聚划算抢购,我们生活的方方面面都可以看到秒杀的身影.秒杀的架构设计也是对于一个架构师架构设计能力的一次考验.本文的目的并不在于提供一个可以直接落地 ...

  2. 使用Redis搭建电商秒杀系统

    作者:小热爱 来源:https://juejin.cn/post/6955372476649963556 秒杀活动是绝大部分电商选择的低价促销.推广品牌的方式.不仅可以给平台带来用户量,还可以提高平台 ...

  3. Java程序猿笔记——基于redis分布式锁实现“秒杀”

    最近在项目中遇到了类似"秒杀"的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓"秒杀"的基本思路. 业务场景 所谓秒杀,从业务角度看,是短时 ...

  4. “百变”Redis带你见识不同场景下的产品技术架构

    2018飞天技术汇24期-云数据库Redis产品发布会,由阿里云数据库技术组技术专家王欢.怀听.梁盼分别带来以"Redis全球多活产品"."Redis混合存储产品&quo ...

  5. 秒杀场景的九个细节,细思极恐!

    往期热门文章:1.放弃MyBatis!我选择 JDBCTemplate! 2.生成订单30分钟未支付,则自动取消,该怎么实现? 3.Lombok代码"亚健康"元凶? 4.IDEA的 ...

  6. Redis分布式锁实现秒杀

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010359884/article/details/50310387 最近在项目中遇到了类似&quo ...

  7. 从Redis List的各种使用场景来深刻理解它

    文章目录 一. 任务队列:由于Redis List支持阻塞式弹出元素,并且支持多个客户端同时阻塞在同一个List上,因此可以用来实现任务队列.例如,将需要异步执行的任务存储在一个List中,多个工作线 ...

  8. Redis五大数据类型与使用场景汇总!!(含完整实战案例,建议收藏)

    本文全面讲述了Redis的五大数据类型和使用场景,含完整实战案例,强烈建议收藏!! 大家好,我是冰河~~ 最近面试跳槽的小伙伴有点多,给我反馈的面试情况更是千差万别,不过很多小伙伴反馈说:面试中的大部 ...

  9. 秒杀场景下超卖问题解决方案

    秒杀超卖现象:在高并发下,多个线程并发更新库存,导致库存为负的情况. 我搜集了一些资料,整理了一下,秒杀可选方案主要有以下三种: 1.超卖原因 一个简单的订单表 create table orders ...

最新文章

  1. mysql 和 mongo db 语法对比
  2. 使用Toast进行用户提醒(转)
  3. 耿建超英语语法---被动语态
  4. AT5661-[AGC040C]Neither AB nor BA【模型转换】
  5. 苹果app商品定价_App Store 即将进行价格调整
  6. Python出入库简洁系统
  7. 8个顶级云安全解决方案
  8. scala安装与配置
  9. 3D建模软件快捷键操作:3DMAX篇(第二期)
  10. android在wifi和4G网络都可以使用的情况下,设置每次请求使用的网络类型
  11. 怎么用计算机打游戏视频,如何录制电脑上正在玩的游戏视频
  12. 2020武理计专上岸,拿下一等奖学金的曲折经历分享
  13. oracle 取农历函数,完善SQL农历转换函数
  14. 正负号 substr java_实战LeetCode 系列(一) (题目+解析)
  15. python推箱子游戏顶层设计子层设计_python实现推箱子游戏
  16. プログラム・ライブラリ
  17. ESP8266 NodeMCU:ESP-NOW Web 服务器传感器仪表板(ESP-NOW + Wi-Fi)
  18. Red Team后漏洞利用秘籍:如何使用C#语言实现系统调用
  19. PowerDesigner16.5反向工程获取Oracle11g数据表结构遇到的问题及解决方法
  20. 磊科nw705p虚拟服务器设置,教你如何设置磊科nw705p无线路由器的详细步骤【图文】...

热门文章

  1. 初学Python实训心得以及一个爬虫例子
  2. ELK日志分析系统(一)之ELK原理
  3. java上课听不懂怎么办_为什么都说参加Java培训班依然学不会?
  4. 黑马学ElasticSearch(五)
  5. Qt应用程序开发框架-快速入门篇
  6. ArcGIS中的投影变换问题
  7. 马拦过河卒(C++)
  8. 关于计算机的名言英语作文,英语作文名言,英语作文万能结尾句子?
  9. 案例:Nginx作为Web缓存服务器应用
  10. Unity实现UGUI空物体颜色渐变的描边方法