Redis01-缓存击穿、穿透和雪崩

news2024/11/24 10:36:07

目录

开场白-追命3连

使用场景

01缓存穿透场景与方案

02布隆过滤器

03缓存击穿场景与方案

04缓存雪崩场景与方案



开场白-追命3连

  • 看你项目中有说用到Redis,都是哪些场景使用了Redis呢?

  • 如果发生了缓存穿透、击穿、雪崩如何应对呢?缓存中数据的持久化和双写一致怎么实现的呢?数据过期和淘汰策略了解么?

  • 能说说Redis实现分布式锁的方案和原理么?

使用场景

01缓存穿透场景与方案

使用缓存是一种常见的性能优化和数据管理策略,它可以带来许多好处:

  1. 提高性能:缓存允许将常用或重复访问的数据存储在快速访问的位置,通常是内存中。这可以大大减少从慢速数据存储系统(如数据库)中读取数据的次数,从而显著提高应用程序的响应时间和性能。

  2. 减少资源消耗:读取和计算数据通常需要消耗计算资源和网络带宽。通过将结果缓存,可以减少这些资源的消耗,提高系统的效率。

  3. 降低数据库负载:数据库是许多应用程序的关键数据存储,频繁的数据库查询可以增加数据库的负载。通过缓存常用查询结果,可以减轻数据库的压力,提高数据库的可伸缩性。

  4. 减少网络延迟:从远程数据源(如云存储或远程API)获取数据通常需要较长的网络延迟。通过使用缓存,可以将数据放置在更接近应用程序的位置,从而降低网络延迟。

  5. 提高可伸缩性:使用缓存可以降低后端数据存储的压力,从而使应用程序更容易扩展,支持更多的用户和请求。

  6. 应对高并发:在高并发的情况下,数据库或其他数据源可能无法及时响应请求。缓存可以缓解这种情况,因为它可以快速提供响应,而不必等待慢速数据源的响应。

  7. 提高用户体验:快速加载和响应时间可以显著提高用户体验,减少等待时间,增加用户满意度。

  8. 实现断点恢复:在某些应用中,缓存可以用于存储临时状态或进度,以支持断点续传或恢复操作,如文件上传或长时间运行的任务。

  9. 保护后端资源:通过缓存来限制对某些资源的访问,可以防止滥用或意外的流量对后端资源的过度消耗。

  10. 离线访问:缓存可以支持离线访问,使应用程序在没有连接到主要数据源时仍能够提供基本功能。

缓存穿透是一种缓存相关的性能问题,指的是恶意请求,通过访问缓存中不存在的数据,大量频繁地请求数据库连接,消耗资源。缓存穿透的明显特征:恶意大量大规模地请求不存在的数据

解决方案1:针对不存在的数据,使用null存入缓存。

  • 优点:方案方便简单

  • 缺点:会消耗大量的内存,有可能引起数据不一致的问题(缓存null的同时插入了真实值,数据就不一致了)

解决方案2:使用布隆过滤器拦截

  • 优点:内存占用少,没有多余key

  • 缺点:设计方案稍微复杂,存在误判

02布隆过滤器

布隆过滤器是一种用于快速检测某个元素是否存在于集合中的数据结构。在缓存层之前使用布隆过滤器,可以快速拦截那些明显不存在于数据源中的请求。在系统启动或数据更新后,就可以预热缓存,将热门数据加载到缓存中。

布隆过滤器实质上是一种位图(bitmap):相当于是一个以(bit)位为单位的数组,数组中每个单元只能存储二进制数0或者1。

  • 存储数据:通过多个hash函数获取hash值,根据hash计算数组对应位置改为1

  • 查询数据:使用相同hash函数获取hash值,判断对应位置是否都为1

误判:当查询并不存在的“武侯区”时,会返回错误的判断结果。

误判率:数组越小误判率越高,数组越大误判率越低,但越大的数组就带来了越多的内存消耗。(使用布隆过滤器的情况下默认允许误判率小于等于5%)

03缓存击穿场景与方案

缓存击穿是指:当一个缓存key设置了过期时间,而在过期的那一瞬间有大量并发请求同时访问这个key,导致请求穿透缓存直接访问数据库,而这个瞬间是有可能把数据库压垮的。

缓存没有命中查询数据库之后不是会写入缓存么?——缓存击穿的瞬间就是发生在这个写入的间隔时间内,哪怕只是10ms

解决方案1:互斥锁,在缓存中设置一个互斥锁,用于保护数据的加载过程,同时避免多个请求并发操作数据。

  • 优点:强一致性

  • 缺点:互斥锁导致资源消耗,性能差

解决方案2:逻辑过期,设置热门数据的缓存永不过期,或者设置一个很长的过期时间,以确保数据不会频繁失效。

  • 优点:高可用性,性能好

  • 缺点:不能保证保证数据绝对一直

04缓存雪崩场景与方案

缓存雪崩是指在某个时间点,缓存中的大量数据同时失效或过期,导致大量请求直接访问后端数据源,对后端系统造成巨大压力的情况。缓存雪崩通常发生在以下场景:

  1. 大规模数据同时过期:在某个时间点,大量缓存数据的过期时间到达,导致这些数据在短时间内同时失效。

  2. 系统重启:当系统重新启动或缓存服务重启时,所有缓存数据都会失效,导致大量请求访问后端数据源。

  3. 热门数据失效:缓存中的热门数据在某个时间点过期,因此大量请求同时访问这些数据。

解决方案1:针对过期时间->通过随机设置缓存数据的过期时间,避免大量数据同时过期。

解决方案2:针对Redis宕机->采用集群的方式部署Redis服务。

解决方案3:针对热门数据失效->在系统启动或低峰期,对热门数据进行预加载到缓存中,以降低高峰时段缓存失效的风险。

解决方案4:使用多级缓存方案,本地缓存+分布式缓存。

解决方案5:兜底策略->限流降级或者熔断,在高峰期对请求进行限流,确保不会过多请求直接访问后端。

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

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

相关文章

研读论文之Image Quality-aware Diagnosis via Meta-knowledge Co-embedding

研读论文之 Image Quality-aware Diagnosis via Meta-knowledge Co-embedding 前言一、简介二、主要内容2.1. 图像退化2.2. 图像质量感知诊断(IQAD)2.3. 元知识协同嵌入网络(MKCNet) 三、实现过程3.1. IQAD问题3.2. 元知识协同嵌入网络 (MKCNet)3.2.1功能3.2.2优化策略3.2.3 Ta…

轻信息服务展示预约小程序的内容是什么

预约几乎是适应所有经营商家的,可以提升客户服务/产品获取度、锁客及便捷性需求,同时也利于提升商家整体经营效率,无论获客还是留存线索都有很高帮助。 尤其对线下服务实体店来说,需要预约形式将客户引流到店,传统商家…

考研数学(数二)核心要点(极限)

前言 okey,今天难得有时间那就稍微整理一下数学部分的内容。注意,本文仅适用于考研冲刺阶段,对知识点进行复习使用。前提是你已经知道了相关知识点,我这里只是把我认为比较重要的,我自己总结的内容给出来,…

基于机器学习的学生成绩预测

学生成绩预测是一个基于回归问题的流行数据科学案例研究。对于数据科学初学者来说,这是一个很好的回归问题,因为它很容易解决和理解。本文中,将带你通过使用Python的机器学习来完成学生成绩预测的任务。 学生成绩预测(案例研究&a…

本地idea远程调试服务器程序

本文主要介绍idea本地调试远程服务器程序的方式。相信很多同行跟我一样,在最初接触公司项目的时候,遇到测试提出的缺陷,往往会在本地进行调试、替换jar包远程调试等方式,本地调试往往会导致数据和环境不一致的问题使得问题无法复现…

机器学习领域经典书籍推荐

机器学习领域经典书籍 1. 数据挖掘概念与技术2. 机器学习3. 统计学习方法4. 深度学习5. 动手学深度学习(PyTorch版) 1. 数据挖掘概念与技术 原名: Data Mining:Concepts and Techniques,Third Edition 作者: (美&#…

Solidity入门第一步之数据类型

各种类型介绍 数值类型(Value Type):包括布尔型(bool),整数型(int、uint、uint256)等等,这类变量赋值时候直接传递数值。引用类型(Reference Type):包括数组和结构体,这类变量占空间大,赋值时候直接传递地…

Leetcode—707.设计链表【中等】

2023每日刷题(十七) Leetcode—707.设计链表 设计单链表实现代码 typedef struct Node {int val;struct Node* next; } MyLinkedList;MyLinkedList* myLinkedListCreate() {MyLinkedList* mList (MyLinkedList *)malloc(sizeof(MyLinkedList));mList-…

chroot

1.chroot技术 在Linux系统中,系统默认的目录结构都是以/,即根(root)开始的。而在使用chroot之后,进程的系统目录结构将以指定的位置作为根(/)位置。chroot实际作用就是将进程描述符中struct fs_struct中的root的值设置为选定的目录。 在经过…

深度学习之基于Yolov5人体姿态摔倒识别分析报警系统(GUI界面)

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 系统设计概述: 传感器采集:通过在场景中布置摄像头或红外传感器等设备,采集人体…

latex自定义缩写

Latex 写文章可能常用到一些缩写,如: .e.g.i.e.cf.etc.w.r.t.i.i.d.et al. 其中有些要斜体,如果每次都要用 \textit{...}、{\it ...} 弄斜,有点麻烦。CVPR 模板中有定义一些命令,可以更方便地输入这些缩写。这里记录…

openebs

1. 简介 OpenEBS是一款使用Go语言编写的基于容器的块存储开源软件。OpenEBS使得在容器中运行关键性任务和需要数据持久化的负载变得更可靠。 OpenEBS是一组存储引擎,允许您为有状态工作负载(StatefulSet)和Kubernetes平台类型选择正确的存储解决方案。 在高层次上…

CCF-CSP真题《202309-4 阴阳龙》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号:202309-4试题名称:阴阳龙时间限制:2.0s内存限制:1.0GB问题描述: 问题描述 西西艾弗岛的下方是一个庞大的遗迹群,神…

项目实战:优化Servlet,把所有围绕Fruit操作的Servlet封装成一个Servlet

1、FruitServlet 这些Servlet都是围绕着Fruit进行的把所有对水果增删改查的Servlet放到一个Servlet里面,让tomcat实例化一个Servlet对象 package com.csdn.fruit.servlet; import com.csdn.fruit.dto.PageInfo; import com.csdn.fruit.dto.PageQueryParam; import c…

Go语言文本处理:正则表达式与字符串操作

大家好,我是[lincyang]。 今天,我们将一起探讨Go语言在文本处理方面的强大功能,特别是正则表达式和字符串操作。 Go语言以其简洁和高效而闻名,这些特性在文本处理上也得到了很好的体现。 接下来,我将通过丰富的案例…

FPGA的元素组件

注意:关于FPGA的元素这一块儿内容,稍有出入。例如:吉姆莱丁 著,陈会翔 译,由清华大学出版社出版的《构建高性能嵌入式系统》中提到:FPGA通常由查找表、触发器、块RAM、DSP切片、及其他功能元件等元素组成。…

C语言----每日五道选择题Day1

1.第一题 1、指出下列代码的缺陷&#xff08; &#xff09;【多选】 float f[10]; // 假设这里有对f进行初始化的代码 for(int i 0; i < 10;) {if(f[i] 0)break; } A: for(int i 0; i < 10;)这一行写错了 B: f是float型数据直接做相等判断有风险 C: f[i]应该是…

C++初阶--类与对象--const成员和日期类的实现

文章目录 const 成员对一个日期类的实现源码解析构造函数的验证运算符的重复利用前置与后置其他运算符的验证 const 成员 将const修饰的成员函数称之为const成员函数。 在一个成员函数里面&#xff0c;对于this指针指向的对象&#xff0c;是隐藏式的&#xff0c;没有办法用常规…

B-DS二叉树_输出所有目标路径

Description 给定二叉树和一个整数目标targetSum&#xff0c;输出所有从根结点到叶子结点的路径总和等于targetSun的路径。 Input 第一行输入t&#xff0c;表示有t个测试样例。 第二行起&#xff0c;每一行首先输入一个整数targetSum&#xff0c;接着输入n&#xff0c;接着输…

带你拿捏链表

本专栏内容为&#xff1a;数据结构学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握数据结构。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;数据结构 &#x1f69a;代码仓库&#xff1a;小小u…