当前位置: 首页 > article >正文

项目中Redis常见的一些问题(缓存穿透,缓存雪崩,内存耗尽等)

缓存穿透

缓存穿透是指查询一个不存在的数据,导致每次请求查询这个不存在的数据 都会转发到数据库,可能导致数据库崩溃

通常都会用布隆过滤器来解决它

布隆过滤器

布隆过滤器主要是用于检索一个元素是否在一个集合中。
它的底层主要是先去初始化一个比较大数组,里面存放的二进制0或1。在一开始都是0,当一个key来了之后经过3次hash计算,找到对应的数据的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一个key的存在
它的缺点是可能会产生一定的误判,我们一般可以设置这个误判率为5%,如果想要更低的误判率就得增加数组的长度

缓存雪崩

缓存雪崩是指在我们设置缓存时采用了相同的过期时间导致缓存在某一时刻同时失效,请求全部转发到数据库,数据库瞬时压力过重崩溃

解决方法:

  1. 在原有的失效时间基础上增加一个随机值,使得过期时间分散一些。这样每一个缓存的过期时间的重复率就会降低
  2. 设置二级缓存。二级缓存指的是除了 Redis 本身的缓存,再设置一层缓存,当 Redis 失效之后,先去查询二级缓存。例如可以设置一个本地缓存,在 Redis 缓存失效的时候先去查询本地缓存而非查询数据库

缓存击穿

缓存击穿:大量的请求同时查询一个 key 时,此时这个 key 正好失效了,就会导致大量的请求都落到数据库。缓存击穿是查询缓存中失效的 key,而缓存穿透是查询不存在的key。

解决方法:

加互斥锁。在并发的多个请求中,只有第一个请求线程能拿到锁并执行数据库查询操作

缓存预热

系统上线时,缓存内还没有数据,如果直接提供给用户使用,每个请求都会穿过缓存去访问底层数据库,如果并发大的话,数据库可能直接崩溃,因此我们需要在上线前先将数据库内的热点数据缓存至Redis内再提供出去使用,这种操作就成为"缓存预热"
解决方案:
1.如果数据量不大,可以在项目启动的时候自动进行加载;
2.定时刷新缓存;

缓存降级

访问量剧增,服务出现问题时,仍然需要保证服务还是可用的,即使是有损部分其他服务,仍然需要保证主服务可用。可以将其他次要服务的数据进行缓存降级,从而提升主服务的稳定性

Redis的内存耗尽

如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回)。

配置内存淘汰策略来解决这个问题

内存淘汰策略有哪些?

LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面
LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页面

Redis如何做内存优化?

充分利用Redis的丰富的数据类型,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起
尽可能使用散列表(hashes),散列表使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面


http://www.kler.cn/news/284285.html

相关文章:

  • Elasticsearch - SpringBoot 查询 es 相关示例
  • Linux Debian12安装flameshot火焰截图工具
  • 线段树维护更多类型的信息
  • c++ 分布式服务器 1
  • Linux | 进程池技术解析:利用无名管道实现并发任务处理(含实现代码)
  • NTP时间服务器是什么?功能是什么?京准电钟
  • 今日(2024年8月30日)科技新闻(本周)
  • Git之2.5版本重要特性及用法实例(五十七)
  • 《机器学习》【项目】 爬虫爬取数据、数据分词、贝叶斯算法、判断分类 <完整实战详解> (全篇完结)
  • ajax学习笔记
  • 认知杂谈42
  • 【系统】Linux系统下载 ubuntu/deepin/deepin
  • JAVA毕业设计166—基于Java+Springboot+vue3的流浪宠物救助管理小程序(源代码+数据库)
  • golang学习笔记——channel使用场景
  • 【云原生】Kubernetes中如何通过Pod名称查询Docker容器ID,通过Docker容器ID查询Pod名称?
  • Kafka队列:分布式系统的消息引擎
  • 【方案合集】园区数据治理解决方案(PPT原件)
  • RK3588 系列之2—通过PC网络共享,连接开发板
  • 8款对比分析:哪款协同办公软件最适合您的团队?
  • 算法题常用的STL(Java与C++)(90%)
  • ArcEngine二次开发实用函数18:使用shp矢量对栅格文件进行掩模和GP授权获取
  • CSS线性渐变拼接,一个完整的渐变容器(div),要拆分成多个渐变容器(div),并且保持渐变效果一致
  • YeAudio音频工具的介绍和使用
  • 【系统架构设计师】论文:论需求分析方法及应用
  • TCP/IP五层模型
  • 算法学习:一维数组的排序算法
  • 深入解析 Spring Boot 中 MyBatis 自动配置的流程
  • Python 如何操作 Excel 文件(openpyxl, xlrd)
  • 计算机学习
  • java框架第二课(Reflection反射机制)