通俗易懂Redis缓存穿透,缓存击穿,缓存雪崩

1.1 缓存穿透

原因:当我们查询一个数据的时候,缓存中没有,就会去查询我们的关系型数据库,而且查询不到的数据是不会放到我们的缓存中,就会导致我们每次的请求都会来到我们的关系型数据库中,从而导致关系型数据库宕机。

解决:

(1)缓存空数据:查询返回的数据为空,仍把这个空结果进行缓存

优点:简单

缺点:消耗内存,可能发生缓存与数据库不一致(万一,后面的时候,我们在关系型数据库存储了这个数据呢)

(2)布隆过滤器:当我们在查询redis数据库之前,我们要先查询布隆过滤器,若不存在,直接pass,布隆过滤中存在,则查redis,但前提是在做缓存预热的时候,要初始化好布隆过滤器。

优点:它是二进制数组组成的内存占用少,且基于我们数组的特性,查询也是非常快的

缺点:实现复杂,存在误判。


简介 布隆过滤器

布隆过滤器:快速判断一个元素是否存在于一个集合中。它通过使用bit数组多个哈希函数来实现

数据经过我们一系列的hash函数运算算出来对应的hash值,然后映射到我们的二进制的数组下标,然后标记,把对应的0变成1。

优点:它是二进制数组组成的内存占用少,且安全性好,且基于我们数组的特性,查询也是非常快的。

缺点:它是一个概率性的数据结构,存在一定的误判率,即可能判断一个元素存在于集合中,但实际上并不存在。因为他是应该hash函数运算的,可能两个值的hash函数值一样。其次,无法删除已插入的元素,因为删除元素会影响其他元素的判断结果。最后我们要权衡一下误判率,数组越大,hash函数越大,误判率越小。同时我们的内存占用空间也会变大很多,查询起来,也比较费时间。我们项目中一般是5%以内的误判率一般的项目也能接受,不至于高并发下压倒数据库。

RedissonClient中自带了布隆过滤器,我们可以设置长度和误差率。

  • 若数据库中存在数据,那么布隆过滤器就会在该数据请求过后标记数据的存在,从而避免大量不存在数据请求数据库

1.2 缓存击穿

原因:当某一个key设置的时间过期了,恰好key过期这个时间点有大量的并发请求过来,这些并发请求可能瞬间把DB压垮。(虽然我们数据库查询到的数据,会存储redis,但:存储需要一定时间

解决方案:

  • 对于热点数据我们可以先不设置过期时间,或在访问数据的时候,对数据过期时间进行续期。
  • 使用分布式锁,当缓存失效的时候,不是先从数据库中加载,而是先获取分布式锁,获取分布式锁的线程从数据库查询数据后写回到缓存中,后续没有获取锁的线程只需要等待和重试即可。这样就能避免大量请求压到数据库,虽然牺牲了一定的性能,但确保了数据库的一个稳定性。

1.3 缓存雪崩

缓存雪崩:同一时间段大量的缓存key同时失效或者Redis服务宕机,导致大量的请求到达数据库,带来压力。

与缓存穿透区别:这是大量的key 穿透是一个key

解决方案:

将缓存失效时间分散开,例如:在原有的时间上增加一个随机值,这样缓存的重复率就会降低很多。

拓展:

(1)给业务增加多级缓存:Guava或者Caffenie

(2)给缓存业务增加降级限流策略:ngxin 或 Spring cloud gateway

Redis宕机这个:可以用Redis集群提高服务的可用性(哨兵模式,集群模式)

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

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

相关文章

代码随想录刷题day39|不同路径不同路径II

文章目录 day39学习内容一、不同路径2.1、动态规划五部曲1.1.1、 确定dp数组(dp table)以及下标的含义1.1.2、确定递推公式1.1.3、 dp数组如何初始化1.1.4、确定遍历顺序1.1.5、计算并返回最终结果 1.2、代码 二、不同路径II2.1、动态规划五部曲2.1.1、 …

使用Flink实现Kafka到MySQL的数据流转换:一个基于Flink的实践指南

使用Flink实现Kafka到MySQL的数据流转换 在现代数据处理架构中,Kafka和MySQL是两种非常流行的技术。Kafka作为一个高吞吐量的分布式消息系统,常用于构建实时数据流管道。而MySQL则是广泛使用的关系型数据库,适用于存储和查询数据。在某些场景…

小米SU7 我劝你再等等

文 | AUTO芯球 作者 | 李逵 我必须承认我一时没忍住 犯错了 我不会被我老婆打吧 感觉有点慌呀 这不前两天 我刚提了台问界M9嘛 但是昨晚看小米汽车发布会 是真的被雷总感染到了 真的没忍住 我又冲了台小米SU7 Pro版 本来我是准备抢创始版的 结果1秒钟时间 点进去就…

yolov5 v7.0打包exe文件,使用C++调用

cd到yolo5文件夹下 pyinstaller -p 当前路径 -i logo图标 detect.py问题汇总 运行detect.exe找不到default.yaml 这个是yolov8里的文件 1 复制权重文件到exe所在目录。 2 根据报错提示的配置文件路径,把default.yaml复制放到相应的路径下。(缺少相应…

杨辉三角形(c++实现)

题目 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, … 给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数&a…

实现 Element UI el-table 树形数据的懒加载

当面对大量数据时,一次性加载所有数据可能会导致性能问题。为了解决这一问题,我们可以实现树形数据的懒加载。本文将介绍如何在使用 Element UI 的 Vue 应用中为 el-table 组件的树形数据添加懒加载功能。 懒加载的基本概念 懒加载是一种优化网页或应用…

中国31个省农村用电量(2000-2022年)

数据介绍: 农村用电量是一个动态变化的数据,受到多种因素的影响,包括农村经济发展、人口增长、农业生产活动增加以及电力设备的升级改造等。随着农村经济的发展和农民生活水平的提高,农村用电量呈现出逐年增长的趋势。同时&#…

收获的果实将远远超出你的想象

在追求目标的过程中,刚开始的时候努力所带来的收获可能显得微不足道。然而,随着时间的推移,你会逐渐发现收获的增长是远远超过最初付出的努力的。这就像种下一颗种子,一开始你可能需要付出很多精力去浇灌它,但随着时间…

消息中间件区别

ActiveMQ 我们先看ActiveMQ。其实一般早些的项目需要引入消息中间件,都是使用的这个MQ,但是现在用的确实不多了,说白了就是有些过时了。我们去它的官网看一看,你会发现官网已经不活跃了,好久才会更新一次。 它的单机吞…

LeetCode 2908.元素和最小的山形三元组 I:贪心(两次遍历)——双O(n)复杂度

【LetMeFly】2908.元素和最小的山形三元组 I:贪心(两次遍历)——双O(n)复杂度 力扣题目链接:https://leetcode.cn/problems/minimum-sum-of-mountain-triplets-i/ 给你一个下标从 0 开始的整数数组 nums 。 如果下标三元组 (i,…

查找某数据在单链表中出现的次数

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct LinkNode {ElemType data;LinkNode* next; }LinkNode, * LinkList; //尾插法建立单链表 void creatLinkList(LinkList& L) {L (LinkNode*)mallo…

JAVA反射基础篇

简介 Java反射是指在运行时动态地获取类的信息&#xff0c;并可以通过该信息来操作类或对象。通过反射&#xff0c;我们可以在运行时获取类的字段、方法、构造函数等信息&#xff0c;并能够动态地创建对象、调用方法、访问和修改字段的值。 一丶概念 反射是Java语言的一种机…

2024.2.5力扣每日一题——跳跃游戏6

2024.2.5 题目来源我的题解方法一 深度搜索实现方法二 动态规划双端队列 题目来源 力扣每日一题&#xff1b;题序&#xff1a;1696 我的题解 方法一 深度搜索实现 使用深度搜索&#xff0c;每次选择一个在范围内的跳跃点&#xff0c;但是时间通不过。 时间复杂度&#xff1a…

Kafka配置与部署CentOS7[]

静态IP设置 # 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33# 修改文件内容 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic IPADDR192.168.18.128 NETMASK255.255.255.0 GATEWAY192.168.18.2 DEFROUTEyes IPV4_FAILURE_FATALno IPV6INIT…

设计模式之解释器模式的魅力:让代码读懂你的语言

目录 一、什么是解释器模式 二、解释器模式的应用场景 三、解释器模式的优缺点 3.1. 优点 3.2. 缺点 四、解释器模式示例 4.1. 问题描述 4.2. 问题分析 4.3. 代码实现 4.4. 优化方向 五、总结 一、什么是解释器模式 解释器模式&#xff08;Interpreter pattern&…

kubernetes(K8S)学习(七):K8S之系统核心组件

K8S之系统核心组件 K8s系统核心组件1.1 Master和Node1.2 kubeadm1.3 先把核心组件总体过一遍1.4 Kubernetes源码查看方式1.5 kubectl1.6 API Server1.7 集群安全机制之API Server1.8 Scheduler1.9 kubelet1.10 kube-proxy K8s系统核心组件 1.1 Master和Node 官网 &#xff1a;…

360奇酷刷机 360刷机助手 QGDP360手机QGDP刷机

360奇酷刷机 360刷机助手 QGDP破解版360手机QGDP刷机 360手机刷机资源下载链接&#xff1a;360rom.github.io 参考&#xff1a;360手机-360刷机360刷机包twrp、root 360奇酷刷机&#xff1a;360高通驱动安装 360手机刷机驱动&#xff1b;手机内置&#xff0c;可通过USB文件传输…

搜索与图论——染色法判定二分图

一个图是二分图当且仅当这个图中不含奇数环 由于图中没有奇数环&#xff0c;所以染色过程中一定没有矛盾 所以一个二分图一定可以成功被二染色&#xff0c;反之在二染色的过程中出现矛盾的图中一定有奇数环&#xff0c;也就一定不是二分图 #include<iostream> #includ…

【c++初阶】类与对象(中)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

2024.3.30力扣刷题记录-二叉树学习记录2(未完)

一、学习视频 如何灵活运用递归&#xff1f;【基础算法精讲 10】_哔哩哔哩_bilibili 二、跟练代码 1. 100. 相同的树 递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # …