长钉可以用在很多活动中。本文主要介绍redis Spike系统的实现,通过实例代码详细介绍,具有一定的参考价值。感兴趣的朋友可以参考一下。
: 目录
1.如何设计扣球系统2?秒杀流程2.1前端处理2.2后端处理3。超卖问题4。大意
1.如何设计一个秒杀系统
在设计任何系统之前,我们首先需要了解秒杀系统的业务背景。
这里有一个简单的例子:
某个时间点,某个电商网站想低价销售某个商品,抢购人数超过几十万。
所以我们面临的第一个秒杀问题是:
时间极短,然后瞬间流量非常大
。我们的系统必须保证抢购的结果没有错误,达到抢购的预期目的。
而且,秒杀库存的实现还需要保证秒杀结果的准确性。
总结以下特征:
高性能:spike中有大量的并发读写,所以让系统支持高并发访问是一个关键点。高可用性:藐视一时的流量非常大,容易造成系统宕机,需要从各个方面保证系统的可用性。一致性:由于大量的峰值请求,我们此时需要准确的峰值结果。因为一旦出了问题,就会大范围传播,造成巨大损失。
2.秒杀流程
先说斯派克的入口。
入口被钉住的地方会有这些问题需要解决:
2.1 前端处理静态资源处理
秒杀产品一般都包含大量的静态资源,所以这些图片和东西的静态资源一定要放入CDN(内容交付网络),并且尽可能多的放。让秒杀时后端服务器的压力尽可能小。
说到这里,我就重点解释一下CDN。
为了在传统的IP网络上发布丰富的宽带媒体内容,提出了一种基于现有互联网的内容分发平台,为网站提供服务。由于CDN是加快网络接入速度的优化网络覆盖层,因此被形象地称为“网络加速器”。
首先要说的是应用服务器和资源服务器要解耦,即应用服务器只处理逻辑,资源服务器存储内容或资源。
CDN重在“内容”,即CDN的C所代表的内容。它专注于静态资源的分发和访问,如图片、文本文件、视频、CSS、JS等。任何以文件形式存储的内容都可以部署在CDN网络上,以提高互联网的访问速度和质量。CDN的作用是“分发”,也就是如何快速部署刚才提到的这个网络中的“内容”,从而快速服务用户。其实还有一个更重要的意义,就是用户的快速接入和就近接入。分发的目的是让用户有更好的体验。CDN,入驻“网络”,是部署在全国或全球的大量服务器。基于目前的互联网基础设施,这些服务器在其上形成一个网络,专门用于资源分配。
CDN的原理是什么?为什么用户可以访问最近的服务器?
它主要是利用DNS来判断用户的位置,然后返回离用户最近的机房的服务器的资源地址。
我来通俗的解释一下:
肯德基的总部在美国,但是你家楼下也有一家肯德基,汉堡一模一样。这就是CDN(这个比喻来自知乎,很贴切)。肯德基在全球部署了很多cdn提供服务,用户总能找到最近的门店。这个计算过程就是刚才说的“就近取用”。
什么是CDN的调度呢?
(1)DNS调度是最常用、最通用的调度方案,缺点是存在DNS劫持的风险,调度准确性会较差;
(2)302调度非常适合大文件下载和视频点播两种应用场景。其优点是可以提高调度精度,缺点是会增加首包延迟(在大文件下载和视频点播场景下,对首包延迟不太敏感,但对调度精度要求较高)。
(3)3)HTTPDNS调度的优点是安全性高(避免了DNS劫持的风险),调度准确,但是有一个很大的缺点,需要客户端的支持(比如在手机APP中嵌入SDK),通用性差。
一般来说:
在一个商圈,有两家肯德基,其中一家组织活动,随便吃鸡腿,所以所有顾客都涌向这家店,这家店已经座无虚席,而另一家店则是门可罗雀。这时候CDN的调度功能就要发挥作用了,另一家店也发布消息说,买一个汉堡五折。这时候,第一家店抢不到鸡腿的顾客马上跑到第二家店。此时两家店的客流量处于平衡状态。这是CDN的调度。
恶意访问行为的处理
我们在推出秒杀活动的时候,还需要考虑黄牛开发的各种秒杀器,可以自动填表,自动回答各种问题,自动模拟点击等。使我们无法阻止他们。
有鉴于此,我们可以通过各种作品来限制和识别这些恶意访问。
比如限制IP提交数量,增加各种动态验证码和问题的难度,增加黑名单账号。
秒杀链接隐藏
如果对程序稍有了解的人可以提前获得秒杀链接,那么他们就可以通过程序在最快的时间内发起秒杀请求,这样人们就可以获得大部分的商品。为了防止这种情况,您可以使spike链接动态化。使用MD5算法和其他加密的随机字符串作为URL的一部分,在秒杀开始后释放连接,同时在后台进行检查。这个时候,大量的羊毛党已经可以预防了。
前端限流
可以点秒杀按钮几秒钟,几秒钟只能点一次。
可以在用户向Nginx请求时,使用Nginx将流量分发到多个服务器,也可以过滤部分用户,拦截部分请求,保证后端的稳定性。比如10000个条目,最多放进去100000个请求就够了,其他用户只能等待静态页面。同时,预约时还可以随机发放一些代币。只有拥有这些代币的顾客才能抢购成功。
同时,在分布式架构下,我们还可以通过gateway、Redisloa或nginx限制电流。
2.2 后端处理后端限流
如果服务的流量达到最大值,新的请求就无法进来。
当服务宕机时,也需要将请求引导到备用服务器,然后返回一些静态提示页面等。
隔离要求spike
单独部署
的服务只承担spike一个人的责任,即使出了问题也不影响其他服务。削峰
在某个时间点,峰值流量非常高,因此我们让瞬时传入流量流入缓冲池,然后温和地处理它。最常用的方案是使用消息队列进行处理。
库存预热
由于被秒杀的商品数量一般都是提前知道的,那么我们可以提前将商品的一些数据加载到缓存中。并且可以将商品进行分区秒杀,根据每个区域的用户数量和活跃度,为每个区域分配单独的秒杀商品数量。这也会分散服务器的压力。
使用缓存
在高并发的情况下,必然会出现缓存雪崩、缓存击穿、缓存穿透等问题。而且spike的场景是多读少写,用Redis做缓存非常合适。为了避免单个Redis服务器造成的缓存崩溃等问题,升级使用Redis集群是比较好的方案。改进可用性的性能也可以大大提高。
我简单说一下缓存雪崩,缓存击穿,缓存渗透。
首先,我们需要了解缓存的处理流程。
前台请求时,后台先从缓存中取数据,得到直接返回结果;当它不可用时,它获取数据库,数据库获取更新缓存并返回结果;如果数据库没有得到结果,会直接返回null结果。
了解了什么是缓存之后,我们再来关注一下这三个排名具体指的是什么,以及如何解决。
缓存穿透
描述:缓存穿透指的是不在缓存或数据库中的数据,但是用户不断发起请求,比如id为“-1”的数据,或者不存在的id特别大的数据。此时用户很可能是攻击者,攻击会导致数据库压力过大。
解决方案:
接口层增加验证,比如用户认证验证,id为基本验证,id=0直接拦截;如果不能从缓存中检索到的数据不是从数据库中检索到的,那么键值对也可以写成key-null,缓存的有效时间可以设置的短一点,比如30秒(设置太长会导致正常情况,不能使用)。这样可以防止攻击用户用同一个id反复暴力攻击。
缓存击穿
描述:缓存崩溃是指缓存中没有数据,但数据库中有数据(通常是缓存时间到期时)。这时候因为有很多并发用户,他们读缓存但不读数据,同时去数据库取数据,导致数据库压力瞬间增大,造成压力过大。
解决方案:
设置热数据永不过期。添加互斥体,互斥体参考代码如下
让我简单解释一下代码思想:
首先,我们从缓存中获取数据。如果数据不存在,我们将获得锁。这个锁只需要互斥,重新输入即可。最简单的方法就是认识到它是redis的setnx。获得锁资源后,我们从数据库中读取数据,将数据更新到缓存中,然后释放锁。如果获取锁资源失败,我们会让它过一段时间再尝试获取锁资源。
缓存雪崩
缓存雪崩是指缓存中大量数据到达失效日期的时间,巨大的查询数据量导致数据库压力过高甚至宕机。
与缓存分解不同,缓存分解是指对相同数据的并发检查。缓存雪崩就是所有不同的数据都过时了,很多数据查不出来,所以数据库可以查。
解决方案:
缓存数据的过期时间是随机设置的,以防止大量数据同时过期。如果缓存数据库是分布式的,则将热数据均匀分布在不同的缓存数据库中。设置热数据永不过期。
3.超卖问题
秒杀很重要的一点就是超卖。因为抢购量大,流量也很大,但是不能超售。
目前,常见的解决方案是:
1.数据库要增加一个唯一的索引,当库存减少时,首先判断库存数量等。应该锁数据库,用乐观锁方法添加版本号等。2
Redis用于维护库存。由于秒杀活动可以提前知道商品的数量,所以可以提前将商品的数据加载到Redis中,如果Redis的库存不足,秒杀就会失败。
3.生成订单时,将请求放入服务器的异步队列中进行处理。可以使用Redis或者MQ的队列。
4.总体思路
其实,秒杀方案的总体思路也很简单:
1.尽可能拦截上游的请求;
2.后端应该处理电流限制;
3.尽量减少对数据库的请求;
4.更多地利用缓存;
5.使用异步操作——可以使用队列等。
6.秒杀服务单一责任;
7.尽可能早地失败,让尖峰请求返回。
关于redis秒杀系统实现的这篇文章到此为止。有关redis spike系统的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!