在线客服
扫描二维码
下载博学谷APP扫描二维码
关注博学谷微信公众号
如何用Redis轻松实现秒杀系统?一般来说有三个办法,即写入内存而不是写入硬盘;异步处理而不是同步处理;分布式处理。相信只要大家做好以上这三点,就能轻松用Redis轻松实现秒杀系统。下面本文将从秒杀的定义,秒杀系统场景特点,秒杀架构设计理念,架构方案和实际案例讲解等方面,为大家介绍如何实现秒杀系统。
1、什么是秒杀?
对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大量用户前来抢购,并且会在约定的时间点同时在秒杀页面进行抢购。比如,秒杀场景一般会在电商网站举行一些活动,或者节假日在12306网站上抢票时遇到。
2、秒杀系统场景特点
秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增。秒杀一般是访问请求数量远远大于库存数量,只有少部分用户能够秒杀成功。秒杀业务流程比较简单,一般就是下订单减库存。
3、秒杀架构设计理念
限流: 鉴于只有少部分用户能够秒杀成功,所以要限制大部分流量,只允许少部分流量进入服务后端。
削峰:对于秒杀系统瞬时会有大量用户涌入,所以在抢购一开始会有很高的瞬间峰值。高峰值流量是压垮系统很重要的原因,所以如何把瞬间的高流量变成一段时间平稳的流量也是设计秒杀系统很重要的思路。实现削峰的常用的方法有利用缓存和消息中间件等技术。
异步处理:秒杀系统是一个高并发系统,采用异步处理模式可以极大地提高系统并发量,其实异步处理就是削峰的一种实现方式。
内存缓存:秒杀系统最大的瓶颈一般都是数据库读写,由于数据库读写属于磁盘IO,性能很低,如果能够把部分数据或业务逻辑转移到内存缓存,效率会有极大地提升。
可拓展:当然如果我们想支持更多用户,更大的并发,最好就将系统设计成弹性可拓展的,如果流量来了,拓展机器就好了。像淘宝、京东等双十一活动时会增加大量机器应对交易高峰。
4、设计思路
将请求拦截在系统上游,降低下游压力:秒杀系统特点是并发量极大,但实际秒杀成功的请求数量却很少,所以如果不在前端拦截很可能造成数据库读写锁冲突,甚至导致死锁,最终请求超时。
充分利用缓存:利用缓存可极大提高系统读写速度。
消息队列:消息队列可以削峰,将拦截大量并发请求,这也是一个异步处理过程,后台业务根据自己的处理能力,从消息队列中主动的拉取请求消息进行业务处理。
5、架构方案
(1)设计思路
将请求拦截在系统上游,降低下游压力:秒杀系统特点是并发量极大,但实际秒杀成功的请求数量却很少,所以如果不在前端拦截很可能造成数据库读写锁冲突,甚至导致死锁,最终请求超时。
充分利用缓存:利用缓存可极大提高系统读写速度。
消息队列:消息队列可以削峰,将拦截大量并发请求,这也是一个异步处理过程,后台业务根据自己的处理能力,从消息队列中主动的拉取请求消息进行业务处理。
(2)前端方案
页面静态化:将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。
禁止重复提交:用户提交之后按钮置灰,禁止重复提交。
用户限流:在某一时间段内只允许用户提交一次请求,比如可以采取IP限流。
(3)后端方案
服务端控制器层(网关层)
限制uid(UserID)访问频率:我们上面拦截了浏览器访问的请求,但针对某些恶意攻击或其它插件,在服务端控制层需要针对同一个访问uid,限制访问频率。
服务层
上面只拦截了一部分访问请求,当秒杀的用户量很大时,即使每个用户只有一个请求,到服务层的请求数量还是很大。比如我们有100W用户同时抢100台手机,服务层并发请求压力至少为100W。
采用消息队列缓存请求:既然服务层知道库存只有100台手机,那完全没有必要把100W个请求都传递到数据库啊,那么可以先把这些请求都写到消息队列缓存一下,数据库层订阅消息减库存,减库存成功的请求返回秒杀成功,失败的返回秒杀结束。
利用缓存应对读请求:对类似于12306等购票业务,是典型的读多写少业务,大部分请求是查询请求,所以可以利用缓存分担数据库压力。
利用缓存应对写请求:缓存也是可以应对写请求的,比如我们就可以把数据库中的库存数据转移到Redis缓存中,所有减库存操作都在Redis中进行,然后再通过后台进程把Redis中的用户秒杀请求同步到数据库中。
(4)数据库层
数据库层是最脆弱的一层,一般在应用设计时在上游就需要把请求拦截掉,数据库层只承担“能力范围内”的访问请求。所以,上面通过在服务层引入队列和缓存,让最底层的数据库高枕无忧。
6、实际案例讲解:
Redis是一个分布式缓存系统,支持多种数据结构,我们可以利用Redis轻松实现一个强大的秒杀系统。我们可以采用Redis最简单的key-value数据结构,用一个原子类型的变量值(AtomicInteger)作为key,把用户id作为value,库存数量便是原子变量的最大值。对于每个用户的秒杀,我们使用 RPUSH key value插入秒杀请求, 当插入的秒杀请求数达到上限时,停止所有后续插入。然后我们可以在台启动多个工作线程,使用 LPOP key 读取秒杀成功者的用户id,然后再操作数据库做最终的下订单减库存操作。
以上就是关于用Redis轻松实现秒杀系统的具体讲解,大家都明白了吗?还有疑问的小伙伴也不用担心,可以在博学谷平台上观看相关的学习视频,相信专业讲师的详细讲解,更能帮助到大家快速掌握用Redis实现秒杀系统的技能。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
Java版的5大功能优势
Java版支持更多的模组、各种节日彩蛋、官方更高的重视性、游戏画面色彩更好、操作更方便。《我的世界》在目前为止有很多的版本,大的类别上有JAVA版、基岩版、携带版,另还有一些小众的版本。
8263
2019-04-10 11:03:58
Java 开发中20种常用类库和 API
java开发人员应该熟悉的常用的库与API::日志、JSON解析、单测、XML解析、字节码处理、数据库连接池、集合类、邮件、加密、嵌入式SQL数据库、JDBC故障诊断以及序列化等20个方面的常用类库!
8695
2019-07-24 18:27:45
Docker开发教程学习资源
Docker开发教程学习资源,需要学习Docker概览、Docker版本与安装介绍、Docker核心技术之镜像、Docker核心技术之容器、Docker核心技术之容器与镜像、Docker核心技术之数据卷、Docker核心技术之仓库、Docker核心技术之Dockerfile、Docker核心技术之Docker-Compose。
4221
2019-11-11 19:14:44
JSP基础语法学习笔记总结
JSP作为一种动态网页开发技术,是以 Java 语言作为脚本语言,并且在服务端运行。因此,对于Java程序员来讲,掌握JSP基础语法是十分重要的。本文为大家总结了JSP基础语法学习笔记,内容包括了指令、注释和内置对象。下面让我们开始JSP基础语法的学习吧!
4163
2020-04-03 11:37:01
进阶Java中级程序员学习路线知识点汇总
企业对于中级程序员的任职要求:有两年以上Java开发经验,熟悉设计模式;熟练使用MySQL或Oracle数据库,熟练使用tomcat应用程序服务器;熟悉hibernate,spring,struts或ibatis 等主流技术框架;使用eclipse、svn、cvs、pl/sql等工具;有丰富的J2EE开发经验;有工业信息化开发经验或熟悉Modbus、OPC协议者优先。
5269
2020-08-28 16:11:03