面试笔记——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.rhkb.cn/news/278366.html

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

相关文章

豆瓣电影信息爬取与可视化分析

目录 一、项目背景 二、代码 三、总结 一、项目背景 (1)利用requests库采集豆瓣网分类排行榜 (“https://movie.douban.com/chart”)中各分类类别前100部电影的相关信息并存储为csv文件。 (2)利用获取的13个分类类别共1300部电…

Leetcode 1. 两数之和

心路历程: 很简单的题,双层暴力就可以,用双指针的话快一点。暴力时间复杂度O( n 2 n^2 n2),双指针时间复杂度O(nlogn) O(n) O(n) O(nlogn)。 注意的点: 1、题目需要返回原数组的索引,所以排序后还需要…

x6.js 从流程图组件库中拖拽组件到画布dnd使用

上一篇已经了解到了x6.js常用功能以及使用方法。但我们使用流程图的时候还少不了一个非常重要的功能那就是拖拽组件库里的组件进来。如下图: 首先是布局这块,拖拽组件库的视图中布局无需我们去写,我们只需把界面搭建好。 添加组件库 1.搭建布…

开班在即 | 全栈开发与自动化测试高薪私教班,带你从0到1拿到高薪Offer

随着ChatGPT的火爆以及人工智能的崛起,在互联网工作的我们仿佛都感受到了职业危机。同时,我们也应该看到,人工智能技术的发展也带来了新的机遇,只要利用好人工智能,便会大大提升我们的工作效率。比如说,我们…

数据结构与算法Bonus-KNN问题的代码求解过程

一、问题提出 (一)要求 1.随机生成>10万个三维点的点云,并以适当方式存储 2.自行实现一个KNN算法,对任意Query点,返回最邻近的K个点 3.不允许使用第三方库(e.g.flann,PCL,opencv)! 4.语言任选(推荐…

智慧城市与数字经济:共创城市新价值

随着科技的快速发展,智慧城市与数字经济已成为推动城市现代化进程的重要引擎。它们不仅提升了城市治理的效率和公共服务水平,还为城市经济发展注入了新的活力。本文旨在探讨智慧城市与数字经济如何共同创造城市新价值,并分析其面临的挑战与发…

【晴问算法】入门篇—贪心算法—整数配对

题目描述 有两个正整数集合S、T,其中S中有n个正整数,T中有m个正整数。定义一次配对操作为:从两个集合中各取出一个数a和b,满足a∈S、b∈T、a≤b,配对的数不能再放回集合。问最多可以进行多少次这样的配对操作。 输入描…

YOLOv5目标检测学习(4):YOLOV5源码的文件结构解析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言①py、cpp、java后缀的文件②md、txt、yml后缀的文件③yaml后缀的文件 一、.github文件夹1.1 workflows文件夹:该文件夹通常包含GitHub Actions 的工…

人工智能如何撬动新质生产力发展?

全国两会期间,“新质生产力”成为高频词,引发高度关注。新质生产力是由技术革命性突破、生产要素创新性配置、产业深度转型升级催生的当代先进生产力。而人工智能被视为形成新质生产力的重要引擎。 随着人工智能(AI)技术跨越奇点…

软件工程-第3章 软件需求与软件需求规约

3.1 需求与需求的获取 需求发现技术:自悟、交谈、观察、小组会、提炼。 3.2 需求规约SRS及其格式 3.3 本章小结

Java 根据IP获取IP地址信息(离线)

<!-- https://mvnrepository.com/artifact/org.lionsoul/ip2region --><dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>2.7.0</version></dependency> 地址&#xff1a;http…

YOLOV5 部署:QT的可视化界面推理(创建UI,并编译成py文件)

1、前言 之前用YOLOV5 做了一个猫和老鼠的实战检测项目,本章将根据之前训练好的权重进行部署,搭建一个基于QT的可视化推理界面,可以检测图片和视频 本章使用的数据集和权重参照:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 可视化界面如下: 2、安装Pyside6 本…

Windows,MacOS,Linux下载python并配置环境图文讲解

Windows 打开python官网 点击download 点击黄色按钮 另存为 打开文件 全选 配置安装路径 安装中 关闭路径长度限制 完成 验证 同时按住winr(win就是空格键左边的东西) 输入cmd 键入python,如果出现版本(红框)即安装成功 MacOS 同理打开python官网 点击最新版本 拖…

在AI创业热潮下,如何抓住AI赚钱机会,实现人生逆袭

随着人工智能技术的迅猛发展,AI创业热潮正席卷全球。这不仅为科技领域的专业人士提供了无限的商机,也为普通人开辟了全新的赚钱途径。本文将为您揭示在AI创业热潮下,普通人如何抓住AI赚钱机会,实现人生逆袭,同时探讨哪些行业适合应用AI技术。 一、普通人如何抓住AI赚钱机…

基于单片机的灭火机器人设计

目 录 摘 要 I Abstract II 引 言 1 1 系统方案设计 4 1.1 方案论证 4 1.2 灭火机器人系统工作原理 4 2 系统硬件设计 6 2.1 单片机 6 2.2 火焰探测系统设计 8 2.3 灭火系统设计 8 2.4 循迹模块设计 9 2.5 电机驱动模块 10 3 系统软件设计 12 3.1 系统软件开发环境 12 3.2 系统…

java入门 -输入和输出

输入输出 开发中大量会使用输入和输出&#xff0c;今天来总结一下Java语法阶段常使用的输入和输出。 输出 System.out 控制台输出信息。 不换行显示一行&#xff1a; System.out.print( ); System.out.print("hello "); System.out.print("java!");运行结…

EMQX 4.0和EMQX 5.0集群架构实现1亿MQTT连接哪些改进

EMQX 5.0水平扩展能力得到了指数级提升&#xff0c;能够更可靠地承载更大规模的物联网设备连接量。 在EMQX5.0正式发布前的性能测试中&#xff0c;我们通过一个23节点的EMQX集群&#xff0c;全球首个达成了1亿MQTT连接每秒100万消息吞吐&#xff0c;这也使得EMQX 5.0成为目前为…

阿里云-云服务器ECS新手如何建网站?

租阿里云服务器一年要多少钱&#xff1f; 不同类型的服务器有不同的价格。 以ECS计算型c5为例&#xff1a;2核4G-1年518.40元&#xff0c;4核8G-1年948.00元。 阿里云ECS云服务器租赁价格由三部分组成&#xff1a; 也就是说&#xff0c;云服务器配置成本磁盘价格网络宽带价格…

Vue.js+SpringBoot开发企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…

vue3动态组件未渲染问题

渲染问题 component动态组件写法与vue2写法一致&#xff0c;代码如下&#xff1a; <component :is"componentName"/><script setup>import { ref } from vueimport account from ./user/account.vue// 组件名称const componentName ref(account)// 点击…