面试笔记——Redis(缓存击穿、缓存雪崩)

缓存击穿

缓存击穿(Cache Breakdown):某个缓存键的缓存失效时(如,过期时间),同时有大量的请求到达,并且这些请求都需要获取相同的数据,这些请求会同时绕过缓存系统,直接访问数据库。由于在缓存失效的瞬间,数据库可能会承受大量的请求压力,导致响应时间增加,甚至可能导致系统崩溃。
在这里插入图片描述

造成缓存击穿的原因可能包括:

  1. 热点数据:某些特定的数据在短时间内被大量请求访问,导致缓存失效。
  2. 缓存失效策略不当:缓存系统的失效策略可能不够灵活或者不合理,导致某些数据的缓存过期时间设置过短,容易触发缓存击穿。
  3. 并发请求过多:系统同时接收到大量的并发请求,导致缓存失效的同时大量的请求同时访问相同的数据。

为了避免缓存击穿的问题,可以采取以下策略:

  1. 使用互斥锁:可以使用互斥锁或者分布式锁等机制,确保只有一个请求能够查询数据库,其他请求等待查询结果返回。
  2. 逻辑过期:在缓存数据失效之前,通过一些逻辑手段来判断是否需要更新缓存数据,从而避免大量请求同时访问数据库。

方案一——互斥锁:
流程:

  1. 请求到达时的缓存查询

    • 当有请求到达时,首先检查缓存中是否存在对应的数据。
    • 如果缓存中存在数据,直接返回数据给客户端。
    • 如果缓存中不存在数据,则进入下一步处理。
  2. 获取互斥锁

    • 当缓存中不存在数据时,先尝试获取一个互斥锁。
    • 如果成功获取到互斥锁,则继续下一步处理;如果获取失败(即有其他请求已经获取了锁),则等待一段时间后重试或者直接返回错误信息给客户端。
  3. 查询数据库

    • 获取到互斥锁后,再次检查缓存中是否存在数据,因为在等待获取锁的过程中,可能有其他请求已经查询到了数据并放入缓存中。
    • 如果缓存中存在数据,释放互斥锁,然后直接返回数据给客户端。
    • 如果缓存中仍然不存在数据,则查询数据库获取数据。
  4. 更新缓存

    • 获取到数据后,将数据存入缓存中。
    • 设置合适的缓存过期时间。
    • 释放互斥锁。
  5. 返回数据

    • 将查询到的数据返回给客户端。

过程如图:
在这里插入图片描述
特点: 强一致,性能差。

方案二——逻辑过期
逻辑过期是指在缓存数据失效之前,通过一些逻辑手段来判断是否需要更新缓存数据,从而避免大量请求同时访问数据库。
实现步骤:

  1. 设置逻辑过期时间:为缓存数据设置两个过期时间,一个是实际的物理过期时间,另一个是逻辑过期时间。逻辑过期时间比物理过期时间要早一些,通常在物理过期时间的一小段时间内。

  2. 请求到达时的逻辑判断:当有请求到达时,首先查询缓存数据是否过期(是否到达逻辑过期时间)。如果缓存数据已经过期,进入下一步逻辑判断;如果缓存数据未过期,则直接返回缓存数据。

  3. 逻辑判断:在缓存数据过期后,不立即去底层存储系统查询新数据,而是通过一些逻辑手段来判断是否需要更新缓存数据。例如,可以使用分布式锁来确保只有一个线程能够去查询底层存储系统,其他线程等待查询结果返回;或者可以先返回旧数据,并且在后台异步更新缓存数据。

  4. 更新缓存数据:如果经过逻辑判断确定需要更新缓存数据,那么就去底层存储系统查询新数据,并将新数据存入缓存中。然后,更新逻辑过期时间,同时更新物理过期时间。

流程如图:在该例子中,线程1发现数据的逻辑时间过期后,申请获取互斥锁,在申请成功后,重新创建一个线程——线程2用于更新缓存数据,但线程1不必等到线程2执行结束后再继续执行,而是获取缓存中的旧数据(没有到达物理过期时间,因此还可以获取该数据)继续执行;线程3运行时,也发现数据的逻辑时间已过期,但此时线程1已拿到了互斥锁,因此,线程3也是通过获取缓存中的旧数据继续执行;线程4运行时,线程2已经完成了数据更新,因此线程4拿到的是刚从数据库加载的新数据。
在这里插入图片描述
特点: 高可用,性能优。

缓存雪崩

缓存雪崩是指在使用缓存系统时,大量的缓存数据在同一时间段内失效或者Redis服务宕机,导致大量的请求同时涌入数据库进行查询,从而给底层存储系统造成短时间内的巨大压力,甚至导致系统崩溃的现象。
在这里插入图片描述

缓存雪崩发生情况如下:

  1. 大规模缓存失效:当缓存中的大量数据同时过期或者失效时,例如缓存系统因为某种原因(如重启、内存溢出、网络故障等)而导致所有缓存数据失效。

  2. 相同的过期时间:当缓存中的数据设置了相同的过期时间,并且这些数据又在同一时间段内失效时,可能会导致大量请求同时涌入底层存储系统。

  3. 并发访问高峰期:当系统处于高并发访问的时候,例如热门活动、促销活动、秒杀活动等,大量的请求同时访问相同的缓存数据,可能会导致缓存数据同时失效。

避免缓存雪崩的策略:

  1. 设置随机过期时间:避免所有缓存数据同时过期,可以在缓存数据的过期时间上增加一些随机性,使得缓存数据的过期时间分布在一个时间段内。

  2. 利用Redis集群提高服务的可用性:可以提高服务的可用性,并在一定程度上减轻缓存雪崩的影响,如哨兵模式(Sentinel)、集群模式(Cluster)。

  3. 给缓存业务添加降级限流策略:通过合理配置降级限流策略,可以在缓存系统出现异常或者压力过大时,及时采取措施来保护系统的稳定性和可用性,如Nginx、Spring Cloud Gateway。此策略可以作为系统的保底策略,适用于穿透、击穿和雪崩。

  4. 使用多级缓存:可以使用多级缓存架构,例如将热点数据放在内存缓存中,将冷数据放在分布式缓存或者数据库中,以减轻缓存失效带来的影响,如Caffeine、Guava。


相关补充

哨兵模式(Sentinel): 主要作用是监控 Redis 实例的健康状态,当主节点出现故障或不可用时,自动完成故障转移,并选择一个合适的从节点升级为新的主节点,以保证 Redis 服务的可用性,是Redis提供的一种高可用性解决方案。

工作原理:

  1. 哨兵节点部署:首先,需要在 Redis 集群中部署多个哨兵节点,这些哨兵节点相互独立,互相监控,并且可以通过相互通信来实现协作工作。

  2. 监控 Redis 实例状态:每个哨兵节点定期向 Redis 实例发送心跳检测请求,检测 Redis 实例的健康状态,包括主节点和所有从节点的连接状态、复制状态等。

  3. 故障检测与选举:当一个哨兵节点检测到主节点失效时,它会将主节点标记为下线状态,并向其他哨兵节点发送通知。其他哨兵节点收到通知后,也会进行故障检测,并开始进行选举

  4. 选举新的主节点:哨兵节点通过一种基于投票的选举机制,选举一个合适的从节点升级为新的主节点。每个哨兵节点都可以发起投票,并且会向其他哨兵节点发送投票请求,收到最多选票的从节点将会被选举为新的主节点。

  5. 故障转移:选举完成后,哨兵节点会将新的主节点信息广播给所有客户端,并通知其他哨兵节点更新配置信息。客户端收到通知后,会重新连接到新的主节点,从而完成故障转移

  6. 监控与恢复:新的主节点上线后,所有哨兵节点会持续监控 Redis 实例的运行状态,并定期发送心跳检测请求。如果发现新的主节点出现问题或者失效,哨兵节点会再次进行故障检测和选举,以保证 Redis 集群的持续可用。

集群模式(Cluster): 是一种用于提供高可用性和横向扩展的Redis分布式部署方案。在Redis集群模式中,数据被分片(sharding)并存储在多个节点上,同时提供故障检测、自动故障转移、数据重分配等功能,通过分片和节点间的协作,从而允许存储和处理大量数据,因此该模式可以提供高性能、高可用性和横向扩展的特性,适用于处理大规模数据和高并发访问的场景。

相关概念及工作原理:

  1. 分片(Sharding)

    • Redis Cluster将整个数据集分割成16384个槽(slots)。
    • 每个节点负责管理其中一部分槽的数据,当有新的节点加入集群或节点离开时,槽会被重新分配。
  2. 节点间通信

    • 集群中的每个节点都了解其他节点的信息,并通过集群总线进行通信,用于集群配置的传播、节点间的信息交换等。
  3. 故障检测与自动故障转移

    • 集群使用一种基于 Gossip 协议的去中心化的方式进行节点间的状态信息传播。
    • 每个节点都会定期向集群中的随机节点发送PING消息,以检查对方是否在线。如果一个节点在一段时间内没有回应,则被标记为下线。
    • 当主节点失效时,集群中的从节点会发起投票,选举一个从节点升级为新的主节点。
  4. 客户端路由

    • 客户端在连接Redis Cluster时,需要连接到至少一个集群节点,然后由该节点将请求路由到正确的目标节点。
    • 客户端根据key计算出对应的槽,并将请求发送到负责该槽的节点上。
  5. 数据重分配

    • 当增加或删除节点时,Redis Cluster会重新分配槽,并将数据重新分片到新的节点上。
    • 重分片过程中,集群会负责迁移槽上的数据,确保数据的完整性和一致性。

相关文献可参考:https://www.cnblogs.com/yidengjiagou/p/17345831.html
此时,已经流下了无知的泪~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/468950.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据集笔记:METR-la 原始数据转input/ground truth

0 问题介绍 在交通预测/时间序列预测的论文中(如论文笔记:Dual Dynamic Spatial-Temporal Graph ConvolutionNetwork for Traffic Prediction_dual dynamic spatial-temporal graph convolution ne-CSDN博客) 模型输入的是过去12个时间片的…

掌握关键技巧!音频转换精灵如何使用?

在数字媒体时代,音频格式的转换已成为日常工作中不可或缺的一部分。为了满足这一需求,市场上涌现出众多音频转换工具。其中,音频转换精灵以其强大的功能和简便的操作赢得了广泛好评。本文将为你详细介绍如何使用该软件,让你轻松完…

Compose UI 之 Segmented buttons 分段按钮

Segmented buttons SegmentedButton 是一种分段式按钮组件,它允许用户在一组相关的选项中选择一个或几个。 上图中:① 单选的分段式按钮。② 多选的分段式按钮。 分段式按钮的几个特点: 分段式按钮是带有状态的按钮,又有单选和多选之分。 从设计上将,不论是单选或是多选…

C# StableDiffusion StableDiffusionSharp 脱离python臃肿的环境

目录 说明 效果 项目 代码 下载 C# StableDiffusion StableDiffusionSharp 脱离python臃肿的环境 说明 Stable Diffusion in pure C/C github地址:https://github.com/leejet/stable-diffusion.cpp C# Wrapper for StableDiffusion.cpp github地址&#x…

SWIFT(环球同业银行金融电讯协会)详细介绍

可以说,最严厉的金融制裁之一,莫过于切断俄罗斯与SWIFT的连接。SWIFT究竟又是什么,在金融领域占据如此重要的地位?本文将从理论、实操以及技术层面展开详尽分析。 本文纲要 前言 一、SWIFT是什么 二、SWIFT的成立背景和组织架…

【13】vue2和vue3对比

vite: https://github.com/vitejs/vite 面试题:谈谈你对 vite 的理解,最好对比 webpack 说明 webpack 原理图 vite 原理图 面试题答案: webpack 会先打包,然后启动开发服务器,请求服务器时直接给予打包结果。 而 vite 是直接启动开发服务器,请求哪个模块再对该模块进行实…

自喻女“梵高”,VRAR元宇宙领域业余画手举办线上3D虚拟数字化处女展!

众所周知,梵高画作通常采用粗大的笔触和厚重的油彩,结合丰富且饱和的色彩,给人印象鲜明大胆且笔触有力,比如著名画作《向日葵》、《星月夜》和《加歇医生》中可以看出,相比传统构图规则,他更倾向于用自己的…

蓝桥杯 2023 省B 接龙数列

思路分析: 创建一个大小为10的向量 hash,用于记录以每个数字结尾的字符串数量。输入字符串数量 n。循环读取每个字符串,并更新 hash 中以当前字符串结尾的字符串数量。同时更新最大字符串数量 count。输出不可达的字符串数量,即 …

HubSpot出海CRM助力企业实现全球营销布局!

随着全球化的浪潮不断推进,越来越多的企业开始将视线投向更为广阔的国际市场,寻求新的增长点。然而,国际化拓展并非易事,企业需要构建一套有效的全球营销战略,以应对不同国家和地区的文化差异、市场需求和竞争环境。在…

漫谈5种注册中心

01 注册中心基本概念 1.1 什么是注册中心? 注册中心主要有三种角色: 服务提供者(RPC Server):在启动时,向 Registry 注册自身服务,并向 Registry 定期发送心跳汇报存活状态。 服务消费者&…

2024热门外贸独立站wordpress模板

工艺品wordpress外贸主题 简约大气的wordpress外贸主题,适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377 日用百货wordpress外贸主题 蓝色大气的wordpress外贸主题,适合做日用百货的外贸公司搭建跨境电商网站使用。 …

R语言程序设计(零基础速通R语言语法和常见函数的使用)

目录 1.Rstudio中的一些快捷键 2.R对象的属性 3.R语言中常用的运算符​编辑 4.R的数据结构 向量 如何建立向量? 如何从向量里面提取元素? 矩阵 如何建立矩阵? 如何从矩阵里面提取元素? 数据框 如何建立数据框&#xf…

Flink源码解析(1)job启动,从JM到TM过程详解

网络传输模型 首先在看之前,回顾一下akka模型: Flink通讯模型—Akka与Actor模型-CSDN博客 注:ActorRef就是actor的引用,封装好了actor 下面是jm和tm在通讯上的概念图: RpcGateway 不理解网关的作用,可以先移步看这里:网关_百度百科 (baidu.com) 用于定义RPC协议,是…

Linux内存管理笔记----TLB

1. TLB介绍 TLB是Translation Lookaside Buffer的简称,可翻译为“地址转换后援缓冲器”,也可简称为“快表”。 简单地说,TLB就是页表的Cache,属于MMU的一部分,其中存储了当前最可能被访问到的页表项,其内…

移远通信,开启透明天线中的“创新密码”

近日,全球领先的物联网整体解决方案供应商移远通信正式对外宣布,其以远远领先行业的速度推出前沿技术成果——5G透明天线。该天线主体选用透明薄膜材质,具有性能优、重量轻、尺寸灵活、透明度高、环境融合度好等优势,特别适用于智…

Spring单元测试+Mockito

一,背景 单元测试基本上是开发逃不过的一个工作内容,虽然往往因为过于无聊,或者过于麻烦,而停止于项目的迭代之中,不了了之了。其实不是开发们懒,而是上头要求的测试覆盖率高,但是又没有好用的…

MFC界面美化第三篇----自绘按钮(重绘按钮)

1.前言 最近发现读者对我的mfc美化的专栏比较感兴趣,因此在这里进行续写,这里我会计划写几个连续的篇章,包括对MFC按钮的美化,菜单栏的美化,标题栏的美化,list列表的美化,直到最后形成一个完整…

面试算法-52-对称二叉树

题目 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 解 class Solution {public boolean isSymmetric(TreeNode root) {return dfs(root, root);}public boolean dfs(Tr…

8年软件测试工程师感悟 —— 写给还在迷茫中的朋友

这两天和朋友谈到软件测试的发展,其实软件测试已经在不知不觉中发生了非常大的改变,前几年的软件测试行业还是一个风口,随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业,目前软件测试行业“缺口”已经基本饱和。当然&a…

【SpringBoot】头条新闻项目实现CRUD登录注册

文章目录 一、头条案例介绍二、技术栈介绍三、前端搭建四、基于SpringBoot搭建项目基础架构4.1 数据库脚本执行4.2 搭建SprintBoot工程4.2.1 导入依赖:4.2.2 编写配置4.2.3 工具类准备 4.3 MybatisX逆向工程 五、后台功能开发5.1 用户模块开发5.1.1 jwt 和 token 介绍5.1.2 jwt…