应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Redis集群介绍及测试思路

  作者:京东零售李磊Redis集群介绍
  Redis集群一般有四种方式,分别为:主从复制、哨兵模式、Cluster以及各大厂的集群方案。在3。0版本之前只支持单实例模式,3。0之后支持了集群方式。在3。0之前各大厂为了解决单实例Redis的存储瓶颈问题各自推出了自己的集群方案,其核心思想就是数据分片,主要有客户端分片、代理分片、服务端分片。这里咱们只介绍前三种方式:主从、哨兵、Cluster。1、主从复制
  Redis单节点的数据是存储在一台服务器上的,如果服务器出现故障,会导致数据不可用,而且读写都是在同一台服务器上,请求量大时会出现IO瓶颈。为了避免单点故障和读写不分离,Redis提供了复制功能来实现Master中的数据向Slave数据库的同步。Master可以有多个Slave节点,Slave节点也可以有Slave节点,从节点是级联结构,如下图所示:
  主从复制工作原理
  一般情况下为了让数据读写分离,Master节点用来执行写操作,Slave节点提供读操作,Master执行写操作时将变化的数据同步到Slave,其工作原理如下图所示:
  Redis主从复制基本原理有三种:全量复制、基于长连接的命令传播、增量复制。
  首先介绍一下全量复制,当主从服务器刚建立连接的时候,会按照三个阶段完成数据的第一次同步。假设现在有实例1(192。168。1。1)和实例2(192。168。1。2),当我们在实例2上执行replicaof192。168。1。16379命令后,实例2就变成了实例1的从库,并开始从实例1上复制数据,有如下三个阶段:
  第一个阶段,是主从库之间建立连接、协商同步的过程,为全量复制做准备。具体来说,从库给主库发送psync命令,表示要进行数据同步,主库根据这个命令的参数来启动复制。psync命令包含了主库的runID和复制进度offset两个参数。
  runID:是每个Redis实例启动时自动生成的一个随机ID,用来唯一标记这个实例。当从库和主库第一次复制时,因为不知道主库的runID,所以将runID设置为?。
  offset:设置为1,表示第一次复制。
  主库收到psync命令后,会用FULLRESYNC响应命令带上两个参数:主库runID和主库目前的复制进度offset,返回给从库,从库收到响应后会记录下这两个参数。FULLRESYNC响应表示第一次复制采用的全量复制,也就是说,主库会把当前所有的数据都复制给从库。
  第二个阶段,主库将所有数据同步给从库,从库收到数据后,首先清空现有数据,然后在本地完成数据加载。这个过程依赖于内存快照生成的RDB文件。具体来说,主库执行bgsave命令,生成RDB文件,接着将文件发给从库。
  第三个阶段,主库会把第二阶段执行过程中新接收到的写命令,再发送给从库。具体来说,当主库完成RDB文件发送后,就会把此时replicationbuffer中的修改和新增操作发给从库,从库再重新执行这些操作。这样一来,主从库就实现同步了。
  以上是全量复制的基本流程,一旦主从库完成了全量复制,它们之间就会一直维护一个网络连接,主库会通过这个连接将后续陆续收到的命令操作再同步给从库,这个过程也称为基于长连接的命令传播,可以避免频繁建立连接的开销。
  长连接是基于网络的,那么它就存在网络断开的风险,在Redis2。8之前,如果主从库在命令传播时出现了网络闪断,那么从库会和主库重新进行一次全量复制,开销非常大。在Redis2。8开始,网络闪断之后,主从库会采用增量复制的方式继续同步,就只会把主从网络断连期间主库收到的命令同步给从库。
  增量复制核心在于replbacklogbuffer这个缓冲区。当主从库断连后,主库会把断连期间收到的写操作命令写入replicationbuffer,同时也会写入replbacklogbuffer这个缓冲区。replbacklogbuffer是一个环形缓冲区,主库记录自己写到的位置,从库也记录自己读到的位置。主从连接恢复之后,从库首先给主库发送psync命令,并把自己当前的slavereploffset发给主库,主库会判断自己的masterreploffset和slavereploffset之间的差距,一般来说masterreploffset会大于slavereploffset。此时,主库只用把masterreploffset和slavereploffset之间的命令操作同步给从库就行。2、哨兵模式
  sentinel,中文名哨兵。Redis的sentinel系统用于管理多个Redis实例,该系统主要执行以下四个任务:
  1。监控(Monitoring):Sentinel会不断的检查主服务器和从服务器是否正常运作。
  2。自动故障转移(Automaticfailover):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
  3。通知(Notification):哨兵可以将故障转移的结果发送给客户端。
  4。配置提供者(Configurationprovider):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。
  其中,监控和自动故障转移功能,使得哨兵可以及时发现主节点故障并完成转移;而配置提供者和通知功能,则需要在与客户端的交互中才能体现。
  哨兵用于实现Redis集群的高可用性,本身也是分布式的,作为一个哨兵集群去运行。Sentinel的进程之间使用流言协议(gossipprotocols)来接收关于主服务器是否下线的信息,并使用投票协议(agreementprotocols)来决定是否执行自动故障迁移,以及选择哪个从服务器作为新的主服务器。下面分别介绍一下监控和自动故障转移的基本原理:Sentinel集群监控原理
  1。每个Sentinel以每秒一次的频率向它所知的主从服务器以及其它Sentinel实例发送一个PING命令。
  2。如果一个实例距离最后一次有效回复PING命令的时间超过指定的值,那么这个实例会被Sentinel标记为主观下线。
  3。正在监视这个主服务器的所有Sentinel要以每秒一次的频率确认主服务器的确进入了主观下线状态。
  4。有足够数量的Sentinel在指定的时间范围内同意这一判断,那么这个主服务器被标记为客观下线。
  5。每个Sentinel会以每10秒一次的频率向它已知的所有主从服务器发送INFO命令。当一个主服务器被Sentinel标记为客观下线时,Sentinel向下线主服务器的所有从服务器发送INFO命令的频率会从10秒一次改为每秒一次。
  6。Sentinel和其它Sentinel协商主节点的状态,如果主节点处于ODOWN(客观下线)状态,则投票自动选出新的主节点,将剩余的从节点指向新的主节点进行数据复制。
  7。当没有足够数量的Sentinel同意主服务器下线时,主服务器的客观下线状态就会被移除。主服务器重新向Sentinel的PING命令返回有效回复时,主服务器主观下线状态就会被移除。
  哨兵是如何对Slave进行监控的呢?当然是通过Master来实现的,哨兵向Master发送INFO命令,Master收到命令后便将Slave列表告诉哨兵。然后哨兵根据Slave列表信息与每一个Slave建立连接,并且根据这个连接持续监控Slave。Sentinel集群故障自动转移
  故障转移简单来说有以下三个流程:
  1。Sentinel系统挑选出现故障的主服务器属下的其中一个从服务器,并将选中的从服务器升级为新的主服务器。
  2。Sentinel系统向出现故障的主服务器属下的所有从服务器发送新的复制命令,让他们成为新的主服务器的从服务器,当所有从服务器都开始复制新的主服务器时,故障转移操作执行完毕。
  3。Sentinel系统还会继续监听已下线的故障服务器,如果它重新上线时,会将它设置为新的主服务器的从服务器。
  示意图
  如上图所示,Server1为Master节点,Server2、Server3、Server4为主服务器Server1的从节点,而Sentinel系统正在监视所有4个服务器
  故障转移
  如上图所示,主服务server1挂掉了,处于下线状态,那么server2、server3、server4对主服务器的复制操作将被终止,Server2被Sentinel系统升级为新的Master,然后将Server2和Server3转为新Master的从服务器,完成故障转移。同时继续监听已下线的Server1。
  如上图所示当Server1恢复后,Sentinel系统将它设置为新的主服务器Server2的从服务器,集群恢复原有状态。3、Cluster集群
  Redis的哨兵模式基本已经可以实现高可用,读写分离,但是在这种模式下每台Redis服务器都存储相同的数据,很浪费内存。所以在redis3。0上加入了Cluster集群模式,实现了Redis的分布式存储,也就是说每台Redis节点上存储不同的内容。Redis集群是由多个主从节点群组成的分布式服务集群,具有复制、高可用和分片特性。这种集群模式没有中心节点,可水平扩展,主要是针对海量数据、高并发、高可用的场景。
  Cluster集群模式主要有以下三个特性:
  1。分片存储:Redis3。0加入了Redis的集群模式,实现了数据的分布式存储,对数据进行分片,将不同的数据存储在不同的master节点上面,从而解决了海量数据的存储问题。
  2。指令转换:Redis集群采用去中心化的思想,没有中心节点的说法,对于客户端来说,整个集群可以看成一个整体,可以连接任意一个节点进行操作,就像操作单一Redis实例一样,不需要任何代理中间件,当客户端操作的key没有分配到该node上时,Redis会返回转向指令,指向正确的Redis节点。
  3。主从和哨兵:Redis也内置了高可用机制,支持N个master节点,每个master节点都可以挂载多个slave节点,当master节点挂掉时,集群会提升它的某个slave节点作为新的master节点。
  如上图所示,Redis集群可以看成多个主从架构组合起来的,每一个主从架构可以看成一个节点。Redis集群数据分片原理
  集群的整个数据库被分为16384个槽(slot),数据库中的每个键都属于这16384个槽的其中一个,集群中的每个节点可以处理0个或最多16384个槽。
  Key与哈希槽映射过程可以分为两大步骤:
  1。根据键值对的key,使用CRC16算法,计算出一个16bit的值。
  2。将16bit的值对16384执行取模,得到016383的数表示key对应的哈希槽。
  另外,Cluster还允许用户强制某个key挂在特定槽位上,通过在key字符串里面嵌入tag标记,这就可以强制key所挂在的槽位等于tag所在的槽位。
  Cluster集群请求路由方式
  客户端直连Redis服务,进行读写操作时,若Key对应的Slot在当前直连的节点上,则可直接读写,但也有可能并不在当前直连的节点上,则经过重定向才能转发到正确的节点,如下图所示
  和普通的查询路由相比,RedisCluster借助客户端实现的请求路由是一种混合形式的查询路由,它并非从一个Redis节点到另外一个Redis,而是借助客户端转发到正确的节点。实际应用中,可以在客户端缓存Slot与Redis节点的映射关系,当接收到MOVED响应时修改缓存中的映射关系。如此,基于保存的映射关系,请求时会直接发送到正确的节点上,从而减少一次交互,提升效率。
  那么客户端具体是怎么确定访问的数据到底分布在哪个实例上呢?
  Redis实例会将自己的哈希槽信息通过Gossip协议发送给集群中其他的实例,实现了哈希槽分配信息的扩散。这样,集群中的每个实例都有所有哈希槽与实例之间的映射关系信息。在切片数据的时候是将key通过CRC16计算出一个值再对16384取模得到对应的Slot,这个计算任务可以在客户端上执行发送请求的时候执行。但是,定位到槽以后还需要进一步定位到该Slot所在Redis实例。当客户端连接任何一个实例,实例就将哈希槽与实例的映射关系响应给客户端,客户端就会将哈希槽与实例映射信息缓存在本地。当客户端请求时,会计算出键所对应的哈希槽,在通过本地缓存的哈希槽实例映射信息定位到数据所在实例上,再将请求发送给对应的实例。
  这个时候大家可能会有个疑问:哈希槽与实例之间的映射关系由于新增实例或者负载均衡重新分配导致改变了咋办?
  集群中的实例通过Gossip协议互相传递消息获取最新的哈希槽分配信息,但是,客户端无法感知。RedisCluster提供了重定向机制:客户端将请求发送到实例上,这个实例没有相应的数据,该Redis实例会告诉客户端将请求发送到其他的实例上。
  Redis如何告知客户端重定向访问新实例呢?分为两种情况:MOVED错误、ASK错误。
  MOVED错误(负载均衡,数据已经迁移到其他实例上):当客户端将一个键值对操作请求发送给某个实例,而这个键所在的槽并非由自己负责的时候,该实例会返回一个MOVED错误指引转向正在负责该槽的节点。
  (error)MOVED16330172。17。18。2:6379
  该响应表示客户端请求的键值对所在的哈希槽16330迁移到了172。17。18。2这个实例上,端口是6379。这样客户端就与172。17。18。2:6379建立连接,并发送GET请求。同时,客户端还会更新本地缓存,将该slot与Redis实例对应关系更新正确。
  ASK错误:如果某个slot的数据比较多,部分迁移到新实例,还有一部分没有迁移咋办?
  如果请求的key在当前节点找到就直接执行命令,否则就需要ASK错误响应了,槽部分迁移未完成的情况下,如果需要访问的key所在Slot正在从从实例1迁移到实例2,实例1会返回客户端一条ASK报错信息:客户端请求的key所在的哈希槽正在迁移到实例2上,你先给实例2发送一个ASKING命令,接着发送操作命令。
  (error)ASK16330172。17。18。2:6379
  比如客户端请求定位到key的槽16330在实例172。17。18。1上,节点1如果找得到就直接执行命令,否则响应ASK错误信息,并指引客户端转向正在迁移的目标节点172。17。18。2:6379
  注意:ASK错误指令并不会更新客户端缓存的哈希槽分配信息。所以客户端再次请求Slot16330的数据,还是会先给172。17。18。1实例发送请求,只不过节点会响应ASK命令让客户端给新实例发送一次请求。MOVED指令则更新客户端本地缓存,让后续指令都发往新实例。Cluster集群选举算法
  1。集群的配置纪元1,是一个自曾计数器,初始值0,每次执行故障转移都会1。
  2。检测到主节点下线的从节点向集群广播一条CLUSTERMSGTYPEFAILOVERAUTHREQUEST消息,要求所有收到这条消息、并且具有投票权的主节点向这个从节点投票。
  3。这个主节点尚未投票给其他从节点,那么主节点将向要求投票的从节点返回一条CLUSTERMSGTYPEFAILOVERAUTHACK消息,表示这个主节点支持从节点成为新的主节点。
  4。参与选举的从节点都会接收CLUSTERMSGTYPEFAILOVERAUTHACK消息,如果收集到的票(N2)1支持,那么这个从节点就被选举为新主节点。
  5。如果在一个配置纪元里面没有从节点能收集到足够多的支持票,那么集群进入一个新的配置纪元,并再次进行选举,直到选出新的主节点为止。
  流程如下图所示:
  Cluster集群故障转移
  Redis集群的故障转移主要有三个流程:故障检测、选主流程、故障转移,下面分别简单介绍一下。
  故障检查
  一个节点认为某个节点失联了并不代表所有的节点都认为它失联了。只有当大多数负责处理slot的节点都认定了某个节点下线了,集群才认为该节点需要进行主从切换。Redis集群节点采用Gossip协议来广播自己的状态以及自己对整个集群认知的改变。比如一个节点发现某个节点失联了(PFail),它会将这条信息向整个集群广播,其它节点也就可以收到这个节点的失联信息。
  如果一个节点收到了某个节点失联的数量(PFailCount)已经达到了集群的大多数,就可以标记该节点为确定下线状态(Fail),然后向整个集群广播,强迫其它节点也接收该节点已经下线的事实,并立即对该失联节点进行主从切换。
  选主流程
  参考上一节的Cluster集群选举算法
  故障转移
  当一个Slave发现自己的主节点进入已下线状态后,从节点将开始对下线的主节点进行故障转移。
  1。从下线的Master节点的Slave节点列表选择一个节点成为新主节点。
  2。新主节点会撤销所有对已下线主节点的slot指派,并将这些slots指派给自己。
  3。新的主节点向集群广播一条PONG消息,这条PONG消息可以让集群中的其他节点立即知道这个节点已经由从节点变成了主节点,并且这个主节点已经接管了原本由已下线节点负责处理的槽。
  4。新的主节点开始接收处理槽有关的命令请求,故障转移完成。Cluster集群扩容与缩容
  扩容
  Redis集群主要有两种扩容方式:垂直扩容和水平扩容。
  垂直扩容:增加内存方式来增加缓存实例的系统容量,比如从2G增加到4G。
  水平扩容:通过增加节点的方式来增加整个缓存系统的容量。
  垂直扩容比较方便,但是受制于机制内存的限制,一个机器不可能无限增大内存,所以到了一定阶段肯定要进行水平扩容。下面我们主要讲一下水平扩容。
  水平扩容又有两种方式:1、主节点数量不变;2、增加主节点数量
  1、主节点数量不变:比如,当前有一台物理机A,构建了一个包含3个Redis实例的集群;扩容时,我们新增一台物理机B,拉起一个Redis实例并加入物理机A的集群;B上Redis实例对A上的一个主节点进行复制,然后进行主备倒换;如此,Redis集群还是3个主节点,只不过变成了A2B1的结构,将一部分请求压力分担到了新增的节点上,同时物理容量上限也会增加,主要步骤如下:
  1。将新增节点加入集群;
  2。将新增节点设置为某个主节点的从节点,进而对其进行复制;
  3。进行主备倒换,将新增的节点调整为主。
  2、增加主节点数量:不增加主节点数量的方式扩容比较简单,但是,从负载均衡的角度来看,并不是很好的选择。例如,如果主节点数量较少,那么单个节点所负责的Slot的数量必然较多,很容易出现大量Key的读写集中于少数节点的现象,而增加主节点的数量,可以更有效的分摊访问压力,充分利用资源。主要步骤如下:
  1。将新增节点加入集群;
  2。将集群中的部分Slot迁移至新增的节点。
  缩容
  如果下线的是slave,那么通知其他节点忘记下线的节点
  如果下线的是master,那么将此master的slot迁移到其他master之后,通知其他节点忘记此master节点
  其他节点都忘记了下线的节点之后,此节点就可以正常停止服务了Redis集群测试思路及常见问题
  集群搭建好之后,就可以对集群的各种功能和使用进行测试了。一般我们会从两个方面来制定测试计划:1、集群功能测试;2、集群调优测试1、集群功能测试
  集群功能测试属于最基本的测试,是为了验证集群所提供的各种功能是否能正常使用,主要有以下方面的内容:
  主从节点的数据备份是否正常
  主从节点的切换功能是否正常
  监控及故障转移功能是否正常
  集群扩缩容功能是否正常
  集群的功能测试类似于黑盒测试,内容比较简单,在这里我们就不展开介绍了,下面主要介绍一下集群在使用过程中的调优测试。2、集群调优测试
  集群调优测试,是为了验证集群在提供服务时,如何最大限度避免因各种异常导致数据丢失或者缓存功能失效,提前对配置进行调优或者提前预案,从而保证缓存架构设计是最优的。需要注意的点主要有:集群脑裂、缓存穿透、缓存击穿、缓存雪崩、缓存预热、缓存降级、缓存更新,下面分别介绍一下定义以及解决方案。集群脑裂
  定义
  当Redis主从集群环境出现两个主节点为客户端提供服务,这时客户端请求命令可能会发生数据丢失的情况。脑裂产生的场景主要有两个:
  1。如果哨兵正在进行选举,故障转移的过程中原主节点恢复和客户端的通信,那么证明原主节点没有真正的故障,这时客户端依旧可以向原主节点正常通信,但是当故障转移结束后,就又产生了一个主节点,这就是脑裂产生的第一个场景,如下图所示:
  2。网络分区,主节点和客户端,哨兵和从库分割为了两个网络,主库和客户端处在一个网络中,从库和哨兵在另外一个网络中,此时哨兵也会发起主从切换,出现两个主节点的情况,如下图所示:
  脑裂出现后带来最严重的后果就是数据丢失,为什么会出现数据丢失的问题呢?
  主要原因是新主库确定后会向所有的实例发送slaveof命令,让所有实例重新进行全量同步,而全量同步首先就会将实例上的数据先清空,所以在主从同步期间在原主库执行的命令将会被清空(上面场景二是同样的道理,在网络分区恢复后原主节点将被降级为从节点,并且执行全量同步导致数据丢失),所以这就是数据丢失的具体原因,如下图所示:
  解决方案
  应对脑裂的解决办法应该是去限制原主库接收请求,Redis提供了两个配置项:
  1。minreplicastowrite:主库能进行数据同步的最少从库数量,否则主节点拒绝写入。
  2。minreplicasmaxlag:主从库间进行数据复制时,从库给主库发送ACK消息的最大延迟(单位s),否则主节点拒绝写入。
  这两个配置项必须同时满足,不然主节点拒绝写入。
  即使原主假故障,假故障期间也无法响应哨兵心跳,也不能和从库进行同步,自然就无法和从库进行ACK确认。这俩配置项组合要求就无法得到满足,原主库就会被限制接收客户端请求,客户端也就不能在原主库中写新数据。等新主上线,就只有新主能接收和处理客户端请求,此时,新写的数据会被直接写到新主。而原主会被哨兵降为从库,即使它的数据被清空,也不会有新数据的丢失。示例如下:
  假设:
  minreplicastowrite1
  minreplicasmaxlag设为12s
  哨兵的downaftermilliseconds设为10s
  主库因某原因卡住15s,导致哨兵判断主库客观下线,开始进行主从切换。同时,因原主库卡住15s,没有一个从库能和原主库在12s内进行数据复制,原主库也无法接收客户端请求。主从切换完成后,也只有新主库能接收请求,不会发生脑裂,也就不会发生数据丢失。
  但是,在实际应用中,真的能完全避免数据的丢失吗?我们看下面的例子:
  假设:
  minreplicastowrite置1
  minreplicasmaxlag设置为15s
  哨兵的downaftermilliseconds设置为10s哨兵主从切换需要5s,主库因为某些原因卡住12s,此时,还会发生脑裂吗?主从切换完成后,数据会丢失吗?
  主库卡住12s,达到哨兵设定的切换阈值,所以哨兵会触发主从切换。但哨兵切换时间5s,即哨兵还未切换完成,主库就会从阻塞状态中恢复回来,且没有触发minslavesmaxlag阈值,所以主库在哨兵切换剩下的3s内,依旧可以接收客户端的写操作,如果这些写操作还未同步到从库,哨兵就把从库提升为主库了,那么此时也会出现脑裂的情况,之后旧主库降级为从库,重新同步新主库的数据,新主库也会发生数据丢失。
  所以,即使Redis配置了minreplicastowrite和minreplicasmaxlag,当脑裂发生时,还是无法严格保证数据不丢失,只是尽量减少数据的丢失。我们需要根据被测系统的性能、网络情况、流量情况来调优这两个参数的配置,当出现异常的时候尽可能最小的缩减数据丢失的时间。缓存穿透
  定义
  当查询Redis中没有的数据时,该查询会下沉到数据库层,同时数据库层也没有该数据,当这种情况大量出现或被恶意攻击时,接口的访问全部透过Redis访问数据库,而数据库中也没有这些数据,我们称这种现象为缓存穿透。缓存穿透会穿透Redis的保护,提升底层数据库的负载压力,同时这类穿透查询没有数据返回也造成了网络和计算资源的浪费。
  解决方案
  1。在接口访问层对用户做校验,如接口传参、登陆状态、n秒内访问接口的次数;
  2。利用布隆过滤器,将数据库层有的数据key存储在位数组中,以判断访问的key在底层数据库中是否存在;核心思想是布隆过滤器,在redis里也有bitmap位图的类似实现,布隆过滤器不能实现动态删除,有时间可以研究下布谷鸟过滤器,是布隆过滤器增强版本。布隆过滤器有误判率,虽然不能完全避免数据穿透的现象,但已经可以将99。99的穿透查询给屏蔽在Redis层了,极大的降低了底层数据库的压力,减少了资源浪费。
  基于布隆过滤器,我们可以先将数据库中数据的key存储在布隆过滤器的位数组中,每次客户端查询数据时先访问Redis:
  如果Redis内不存在该数据,则通过布隆过滤器判断数据是否在底层数据库内;
  如果布隆过滤器告诉我们该key在底层库内不存在,则直接返回null给客户端即可,避免了查询底层数据库的动作;
  如果布隆过滤器告诉我们该key极有可能在底层数据库内存在,那么将查询下推到底层数据库即可;缓存击穿
  定义
  缓存击穿和缓存穿透从名词上可能很难区分开来,它们的区别是:穿透表示底层数据库没有数据且缓存内也没有数据,击穿表示底层数据库有数据而缓存内没有数据。当热点数据key从缓存内失效时,大量访问同时请求这个数据,就会将查询下沉到数据库层,此时数据库层的负载压力会骤增,我们称这种现象为缓存击穿。
  解决方案
  延长热点key的过期时间或者设置永不过期,如排行榜,首页等一定会有高并发的接口;
  利用互斥锁保证同一时刻只有一个客户端可以查询底层数据库的这个数据,一旦查到数据就缓存至Redis内,避免其他大量请求同时穿过Redis访问底层数据库;缓存雪崩
  定义
  缓存雪崩是缓存击穿的大面积版,缓存击穿是数据库缓存到Redis内的热点数据失效导致大量并发查询穿过redis直接击打到底层数据库,而缓存雪崩是指Redis中大量的key几乎同时过期,然后大量并发查询穿过redis击打到底层数据库上,此时数据库层的负载压力会骤增,我们称这种现象为缓存雪崩。
  事实上缓存雪崩相比于缓存击穿更容易发生,对于大多数公司来讲,同时超大并发量访问同一个过时key的场景的确太少见了,而大量key同时过期,大量用户访问这些key的几率相比缓存击穿来说明显更大。
  解决方案
  1。在可接受的时间范围内随机设置key的过期时间,分散key的过期时间,以防止大量的key在同一时刻过期;
  2。对于一定要在固定时间让key失效的场景(例如每日12点准时更新所有最新排名),可以在固定的失效时间时在接口服务端设置随机延时,将请求的时间打散,让一部分查询先将数据缓存起来;
  3。延长热点key的过期时间或者设置永不过期,这一点和缓存击穿中的方案一样;缓存预热
  如字面意思,当系统上线时,缓存内还没有数据,如果直接提供给用户使用,每个请求都会穿过缓存去访问底层数据库,如果并发大的话,很有可能在上线当天就会宕机,因此我们需要在上线前先将数据库内的热点数据缓存至Redis内再提供出去使用,这种操作就成为缓存预热。
  缓存预热的实现方式有很多,比较通用的方式是写个批任务,在启动项目时或定时去触发将底层数据库内的热点数据加载到缓存内。缓存降级
  缓存降级是指当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,即使是有损部分其他服务,仍然需要保证主服务可用。可以将其他次要服务的数据进行缓存降级,从而提升主服务的稳定性。
  降级的目的是保证核心服务可用,即使是有损的。如某年双十一的时候淘宝购物车无法修改地址只能使用默认地址,这个服务就是被降级了,这里阿里保证了订单可以正常提交和付款,但修改地址的服务可以在服务器压力降低,并发量相对减少的时候再恢复。
  降级可以根据实时的监控数据进行自动降级也可以配置开关人工降级。是否需要降级,哪些服务需要降级,在什么情况下再降级,取决于大家对于系统功能的取舍。缓存更新
  缓存服务(Redis)和数据服务(底层数据库)是相互独立且异构的系统,在更新缓存或更新数据的时候无法做到原子性的同时更新两边的数据,因此在并发读写或第二步操作异常时会遇到各种数据不一致的问题。如何解决并发场景下更新操作的双写一致是缓存系统的一个重要知识点。
  参考文档:《Redis设计与实现》黄健宏著https:www。cnblogs。comyizhiamumup16704556。htmlhttps:cloud。tencent。comdeveloperarticle1981186

足球宝贝大盘点来自世界各地的足球迷有可能(他们说有可能)不喜欢足球作为一项运动。但你情不自禁地喜欢那些去体育场看它的女孩。来自世界各地的足球迷马可路易斯冈萨雷斯(Marco……阿克塞县用生态画笔勾勒绿色山水美丽家园近些年,阿克塞县坚持保持加强生态文明建设的战略定力,探索以生态优先、绿色发展为导向的高质量发展之路,大力调整产业结构,加快转产转业的进度,生态环境越来越好,老百姓的生活也越来越……14年军旅生涯,军衔少校,安置体育局的女排刘晏含级别待遇如何刘晏含,中国女排现役最好的球员之一,个性开朗,多才多艺,刘晏含也被很多球迷亲切的称为大刘,2022年,因为种种的意外情况,本来要加盟排超联赛的刘晏含,在最后时刻向球迷汇报了情况……IMSMOM制造系统助力PCB企业抓住机遇快速发展!根据CPCA统计数据,2022年上半年,中国总印制电路板进出口贸易良好,进口数量190。8亿块,出口数量220。4亿块,出口与进口差值为29。6亿块,同比下降175。进口金额3……32到00!皇马创7年不败纪录,金球先生开炸归来,剑指榜首!冬日生活打卡季西甲联赛已全面开战,联赛战罢15轮,争冠、争冠大战达到白热化,争冠大战呈现两大豪门并驾齐驱的局面,红蓝军团巴塞罗那12胜2平1负,打进34球失6球,38分领跑联赛……(科技)上海自主研发智能设备助力市域铁路项目施工忙近期,中铁隧道局上海市域铁路机场联络线11标项目施工现场一派忙碌,工程技术人员运用多种自主研发的智能设备开展施工。上海市域铁路机场联络线于2019年6月开工,项目建成后,上海虹……SQLSERVER居然也能调C代码?一:背景1。讲故事前些天看到一个奇怪的Function函数,调用的是C链接库中的一个UserLogin方法,参考代码如下:CREATEFUNCTIONdbo。clrUse……八闽第一峰雾凇美景金铙山开启仙境模式来源:人民网原创稿人民网三明12月20日电(刘卿、焦艳)近日,受强冷空气影响,素有八闽第一峰之称的福建三明建宁县金铙山出现雾凇景观。漫山遍野银装素裹,晶莹剔透的雾凇挂满枝……百度地图正式登陆理想ONE车机支持路线发送一键充电桩等在理想ONEOTA3。2版本推送之后,今天上午,百度地图官方发文宣布正式登陆理想ONE车机,并介绍了一些特色功能。首先是非常实用的车机、手机互联功能,手机打开百度地图AP……使用一款600元的低端机是什么样的体验?业内人士买就上当了前言如今智能手机的价格呈现上升趋势,以华为手机为例,华为p50Pocket售价8988元。一款搭载了骁龙778的4G手机卖到接近9000元,这只有华为才做得出来。小……归化典范!谷爱凌国籍不容置疑,网友下届冬奥会还指望她拿金牌过去的2022年中国体坛有不少闹心的事儿,比如说隔壁开世界杯,我们除了国足没去剩下的都去了。还有,李铁进去这么多天了,好像除了身边几个要好的铁哥们儿,其他的都还没有供出来。另外……周末复盘,新能源车半导体医疗白酒板块走势分析预测!上证本周走出了2。21中阳上涨,创业板反弹3。21,周线KD低位金叉,即将走出底部区间,上涨空间扩大,但上涨行情会得以延续吗?成交量不足,量价背离,下周一不能放量,则必然……
<<<<<<>>>>>>
塔克终究错付了,76人不顾哈登的反对把塔克放上交易市场76人惨败雷霆队,塔克目前的状态跌宕起伏引发争议。塔克以前底角三分命中率高达50,威胁力十分巨大,对手不敢丝毫懈怠。现在塔克年迈速度慢,底角三分的威胁力只有可怜的20。现在对手……贴发耳矫正选择哪种材料比较好?了解过贴发耳矫正的都知道贴发耳对五官的影响有多大,贴发耳不仅会使脸部放大、还会使个人整体气质缺乏灵动感、使人容易显老和土气,因此贴发耳矫正成为了大家的不二之选。贴发耳矫正……一生的情人,永远的知己爱一个人,就希望他平安喜乐,一切都好。可是,人生哪会没有挫折,生活哪会事事如意,总有会各种各样的烦恼,总要承受不得不承受的苦累。所以,与其希望爱的人平安喜乐,一切都……正视美国的强大与先进,坚定地拥抱和学习美国先进要素!当今世界,美国毫无疑问是全球最强大的国家,没有之一;国内一些所谓大V,自媒体,甚至部分官媒都有一种论调:美国在走向衰落、甚至预言510年内中国就会在中美竞争中取得优势地位,这简……陈戌源被查后,更大一条鱼即将浮出水面,爆关系到总局,天要亮了最近这段时间,无论是中国足球还是中国篮球,都出现了严重的问题,起因就是前国足主教练李铁涉嫌严重违法事情被带走调查。随后李铁又供出了多名相关人员,其中包括国足主力成员,甚至还有前……科普睡前常常产生幻觉?注意患者可能得了发作性睡病发作性睡病是一种慢性神经性睡眠障碍,病因不明。发作性睡病的主要特征是白天过度的嗜睡,即使在夜间睡眠充足之后也是如此。在一天中的不同时间,发作性睡病患者会有短暂的睡眠冲动。……三四线城市房价必然下跌,想买房的朋友可以等等了!最近一段时间,国内房地产市场的调控动作频频,很多城市也都发布了相应的调控政策。比如,北京、上海、广州等一线城市继续收紧调控,深圳、杭州等二线城市也是紧随其后。可以说……穿最喜欢的衣服嫁给最喜欢的人,是每个女孩最向往的爱情1月18日,河南一新娘穿着洛丽塔的衣服出嫁,引起了网友们的热议。从照片上我们可以看出,这位新娘长相甜美,唇红齿白的,真的很漂亮,特别是穿上这套洛丽塔的新娘服,那真是犹如一……和珅升迁最快兼职也最多,但有两个部门乾隆从不让他染指综述《铁齿铜牙纪晓岚》是我们小时候都看过的一部经典电视剧,大学士纪晓岚是一个涵养颇深、非常公正的角色,做人做事讲究的就是一个德行。而与他形成鲜明对比的则是户部尚书和……没有莫兰特,勇士这么打灰熊,赢下这场晋级决赛灰熊队莫兰特因为在5月8日的比赛中膝盖受伤缺席了5月10日的比赛,在5月11日灰熊队宣布莫兰特因为膝伤将大概率缺席剩余的季后赛比赛。在常规赛中,灰熊同样有很长一段时间是在没有莫……教科书级负面情绪处理,这位父亲的方法值得点赞事情的起因是爸爸和女儿开玩笑,不小心惹怒了女儿,女儿非常生气。这位爸爸是这样处理的:01让孩子接纳负面情绪你不一定非得要开心。生气没什么大不了的,你可以生气。……糖豆人终极淘汰赛第六赛季需绑定Epic账号近日,《糖豆人:终极淘汰赛》官方公布了即将推出游戏第六赛季将出现的部分变化。官方表示自《糖豆人:终极淘汰赛》第六赛季开始,玩家必须绑定Epic账号才可以进行游戏,如果PS……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网