面试笔记——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
此时,已经流下了无知的泪~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GameFramework框架内置模块】8、文件系统(File System)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q7…

登录-前端部分

登录表单和注册表单在同一个页面中,通过注册按钮以及返回按钮来控制要显示哪个表单 一、数据绑定和校验 (1)绑定数据,复用注册表单的数据模型: //控制注册与登录表单的显示, 默认false显示登录 true时显…

【MySQL】4. 表的操作

表的操作 1. 创建表 语法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明: field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c…

java方法的引用传递和值传递

1、方法的值参数传递 下面代码,它会在控制台输出什么? public class ArrayTest {public static void main(String[] args) {int number 100;System.out.println(number);change(number);System.out.println(number);}public static void change(int n…

vue3使用qrcodejs2-fix生成背景透明的二维码

qrcodejs官方仓库:GitHub - davidshimjs/qrcodejs: Cross-browser QRCode generator for javascript qrcodejs2-fix 是一个用于生成QR码的JavaScript库,使用的时候先安装,然后通过设置前景色和背景色可以控制显示的二维码效果。想生成透明背…

手撕算法-二叉树的镜像

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。数据范围:二叉树的节点数 0≤_n_≤1000 , 二叉树每个节点的值 0≤_val_≤1000要求: 空间复杂度 O(n) 。本题也有原地操作,即空间复杂度 O(1) 的解法&#xff0c…

士兵排列问题

解法一&#xff1a; deque实现队头入队和队尾入队即可得到编号排列&#xff0c;每个士兵有二个属性&#xff1a;编号、能力值。 #include<iostream> #include<algorithm> #include<deque> #include<vector> using namespace std; #define endl \n st…

汇率与政治的关系?Anzo Capital实例举证

投资者在使用特定货币对交易时&#xff0c;交易者应关注交易所用货币国家的主要政治新闻。众所周知&#xff0c;政治和金融密切相关&#xff0c;因此重要政治消息的发布会对汇率产生强烈影响。 Anzo Capital实例举证&#xff1a;汇率与政治的关系。 其中一个例子&#xff0c…

限流的常见算法

计数器法 计数器算法&#xff0c;也成固定窗口法。可以控制在固定的时间窗口内&#xff0c;允许通过的最大的请求数。 例如&#xff0c;我们设定时间间隔窗口为1分钟&#xff0c;该窗口内的最大请求数max为100。当第1个请求到来时&#xff0c;我们记录下当前窗口内的第一个请…

文件系统 与 软硬链接

目录 一、文件系统 认识磁盘 磁盘存储的逻辑抽象结构 块组的内容 inode Table Data blocks inode Bitmap Block Bitmap Group Descriptor Table Super Block 理解目录 二、软硬链接 软链接​ 硬链接 硬链接数 一、文件系统 之前的博客主题叫做"进程打开文…

Winform编程详解十五:ProgressBar 进度条控件

一、属性介绍 1. (Name) 控件的对象标识符ID 2. BackColor 控件的背景颜色 3. Cursor 鼠标移过该控件显示的光标样式 4. ForeColor 控件的文本颜色 5. UseWaitCursor 使用鼠标的等待光标 6. Enabled 控件激活状态 7. Maximum 进度条的最大值 8. Minimum 进度条的最小…

【物联网应用】基于云计算的智能化温室种植一体化平台

目录 第一章 作品概述 1.1. 作品名称 1.2. 应用领域 1.3.主要功能 1.4.创新性说明 第二章 需求分析 2.1 现实背景 2.2 用户群体及系统功能 2.3 竞品分析 第三章 技术方案 3.1. 硬件组成与来源 3.2. 硬件设计合理性 3.3. 硬件系统设计图 3.4. 接口的通用性与可扩展性 3.5. 代码规…

vue中判断是否使用自定义插槽

在封装自定义组件时&#xff0c;需要判断使用者是否使用了插槽<slot"aaa">&#xff0c;如果没有则使用一个组件中默认的值&#xff0c;反之就用传入的内容<template name"aaa"></template>,实现如下&#xff1a; <div class"lin…

苍穹外卖-day06:HttpClient、微信小程序开发、微信登录(业务流程)、导入商品浏览功能代码(业务逻辑)

苍穹外卖-day06 课程内容 HttpClient微信小程序开发微信登录导入商品浏览功能代码 功能实现&#xff1a;微信登录、商品浏览 微信登录效果图&#xff1a; 商品浏览效果图&#xff1a; 1. HttpClient 1.1 介绍 HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;…

深度解析大模型:概念、架构与应用价值

大模型&#xff0c;作为一种前沿的人工智能技术&#xff0c;已经成为深度学习领域的研究热点和发展趋势。这一概念主要指代那些规模庞大、参数数量众多、结构复杂的机器学习模型&#xff0c;尤其是深度神经网络模型。以下是对大模型的详细介绍&#xff1a; 基本概念 规模参数量…

文件系统I/O FATFS RW 源码分析

文件系统I/O FATFS RW 源码分析 0 参考 FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块。FatFs 整个项目都按照 ANSI C (C89) 编写。与存储器 I/O 解耦良好&#xff0c;便于移植到 8051、PIC、AVR、ARM、Z80、RX 等小型微控制器中。 下面是关于 FAT 文件系统格式…

20.回文链表

给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;head …

linux 安装常用软件

文件传输工具 sudo yum install –y lrzsz vim编辑器 sudo yum install -y vimDNS 查询 sudo yum install bind-utils用法可以参考文章 《掌握 DNS 查询技巧&#xff0c;dig 命令基本用法》 net-tools包 yum install net-tools -y简单用法&#xff1a; # 查看端口占用情况…

浮点数加法

浮点数有时候计算结果会出现长尾小数&#xff0c;例如0.10.110.21000000000002&#xff0c;这种结果很麻烦。用包装类就可以轻松的解决这个问题&#xff0c;不过想着很久没写加法了&#xff0c;高精度加法也不咋写了&#xff0c;自己造下轮子熟悉一下算法&#xff0c;于是就写了…

【学习学习】学习金字塔

学习金字塔&#xff08;Cone of Learning&#xff09;&#xff0c;全称学习吸收率金字塔&#xff0c;是一种现代学习方式的理论。网上流传它是美国缅因州的国家训练实验室&#xff08;National Training Laboratories&#xff09;研究成果&#xff0c;用数字形式形象显示了采用…