redis缓存穿透、缓存雪崩 、缓存击穿

news/2024/6/19 4:07:07

一、缓存穿透、缓存雪崩 、缓存击穿

摘自尚硅谷文档
1、缓存穿透
在这里插入图片描述

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数
据库也无此记录,我们没有将这次查询的 null 写入缓存,这将导致这个不存在的数据每次
请求都要到存储层去查询,失去了缓存的意义。
在流量大时,可能 DB 就挂掉了,要是有人利用不存在的 key 频繁攻击我们的应用,这就是
漏洞。
解决:
缓存空结果、并且设置短的过期时间。

2、缓存雪崩
在这里插入图片描述

缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失
效,请求全部转发到 DB,DB 瞬时压力过重雪崩。
解决:
原有的失效时间基础上增加一个随机值,比如 1-5 分钟随机,这样每一个缓存的过期时间的
重复率就会降低,就很难引发集体失效的事件。

3、缓存击穿
在这里插入图片描述

对于一些设置了过期时间的 key,如果这些 key 可能会在某些时间点被超高并发地访问,
是一种非常“热点”的数据。
这个时候,需要考虑一个问题:如果这个 key 在大量请求同时进来前正好失效,那么所
有对这个 key 的数据查询都落到 db,我们称为缓存击穿。
解决:加锁

二.个人理解redis缓存穿透、缓存雪崩 、缓存击穿

1.缓存穿透
高并发情况下查询缓存不存在的数据导致并发查数据库 解决办法:查询数据库结果为null时,在缓存中设置不为null的空值(0,1),并设置过期时间,保证缓存能查到该数据

2.缓存雪崩
高并发情况下查询时,因为key设置相同的过期时间而key集体失效 解决办法:给key设置随机过期时间,防止集体失效 set(“categoryJson”,s,1,xxx)

3.缓存击穿
高并发情况下同时访问同一个Key 解决办法:加锁

三.Luttuce 与 jedis

jedis和Lettuce都是Redis的客户端,它们都可以连接Redis服务器

luttuce底层使用Netty网络通信 会出现OutofDirectMomeryError堆内存溢出问题
解决办法:增加JVM可用内存-Xmx?m,升级Luttuce,使用jedis

 <!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><!--lettuce底层使用netty网络通信,会出现内存溢出的问题--><!--解决办法:1.升级lettuce 2.切换jedis--><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency><!--防止堆外内存溢出--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency>

https://dhexx.cn/news/show-4628160.html

相关文章

什么是循环语句?如何使用for循环、while循环和do-while循环?

1. 引言&#xff1a; 循环语句是一种编程结构&#xff0c;用于重复执行一段代码块&#xff0c;直到满足特定条件为止。它在程序中起到了简化代码、提高效率和处理大量数据的重要作用。在本文中&#xff0c;我们将详细讨论三种常见的循环语句&#xff1a;for循环、while循环和do…

flink自动加全局流水

from pyflink.datastream import StreamExecutionEnvironment from pyflink.datastream.functions import MapFunction, RuntimeContext, KeyedProcessFunction import re import redis # 创建 StreamExecutionEnvironment 对象 env StreamExecutionEnvironment.get_executi…

CXGRid实现拖动鼠标多选

要实现在CXGrid中拖动鼠标多选&#xff0c;您可以按住鼠标左键并拖动鼠标&#xff0c;直到选择了要选择的单元格或行。您可以在拖动过程中按住Shift键来限制选择范围。拖动选择的单元格或行时&#xff0c;您可以按住Ctrl键来添加或删除单元格或行的选择。当您完成选择时&#x…

GTK官方教程

前言&#xff1a; 让你在开发中爱不释手的 GT 包。关注GSLS官网&#xff0c;查看更多源码 ヾ(✿&#xff9f;▽&#xff9f;)ノ工具包。 所有文章 小编尽量让读者可以 直接 读懂 与 完全 复制粘贴&#xff0c;其中复杂或较多 的源码 会有 源码 并 贴上 github 网址。 GT 类 里面…

【JUC基础】14. ThreadLocal

目录 1、前言 2、什么是ThreadLocal 3、ThreadLocal作用 4、ThradLocal基本使用 4.1、创建和初始化 4.2、存储和获取线程变量 4.3、清理和释放线程变量 4.4、小结 4.5、示例代码 5、ThreadLocal原理 5.1、set() 5.2、get() 5.3、变量清理 5.4、ThreadLocalMap 6、…

springboot+vue+elementui计算机专业课程选课管理系统vue

本系统的主要任务就是负责对学生选课。主要用户为老师、学生,其中,学生可对自己的信息进行查询,可以进行选课,也可以进行删除已选课程,教师可对学生和课程的信息进行查询&#xff0c;教师拥有所有的权限,可以添加删除学生信息。系统提供界面,操作简单。 为实现这些功能,系统一个…

弄清楚Node.js的功能特性、运行时、组成和发展趋势分析以及与JavaScript的区别

目录 Node.js介绍 Node.js的作用和功能特性 Node.js应用场景 运行时是什么 Node.js的组成 1. V8引擎 2. 本地&#xff08;核心&#xff09;模块 3. 标准库 Node.js的发展趋势 总结 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;使JavaScript可以…

截取文本中间部分字符串算法思想

功能实现效果排除首位部分字符串 确定部分字符串的尾部&#xff0c;获取传入尾部字符串索引起始位置坐标 确定部分字符串的首部&#xff0c;获取传入首部字符串索引位置坐标与首部字符串长度之和 利用字符串截取函数获取即可 public String getSubString(String text, Strin…

图论试题2021

25 A&#xff1a;最大度是7&#xff0c;大于了顶点数6&#xff0c;故不是简单图的度序列。 C&#xff1a;树的度序列至少要有两个度为1的顶点 D&#xff1a;只要度数为奇数的个数有偶数个&#xff0c;就是度序列。 A&#xff1a;每棵树的中心由一个点或两个相邻点组成 B&…

Spring-Cloud-Gateway 整合 Sa-Token 全局过滤器之路由匹配

Spring-Cloud-Gateway 整合 Sa-Token 全局过滤器之路由匹配 Sa-Token 是一个轻量级 Java 权限认证框架&#xff0c;主要解决&#xff1a;登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 Sa-Token 旨在以简单、优雅的方式完…