项目中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),散列表使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面

相关推荐
两点王爷18 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
两点王爷18 小时前
PostgreSQL 好用又独特的特性与空间函数
数据库
梦帮科技18 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
TDengine (老段)20 小时前
TDengine 常见问题 TOP3
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
HanhahnaH20 小时前
Redis单线程和Tair多线程架构设计对比
分布式·缓存
螺蛳粉 螺蛳粉1 天前
MySQL 分布式集群系列 · 第五篇——全方位对比:NDB、MGR、主从复制、分库分表怎么选?
数据库·分布式·mysql
wdfk_prog1 天前
ROS教程07:从 ros::start() 顺着源码读懂 Master、XML-RPC 与 Topic 注册发现
运维·缓存·docker·容器·ros
Escalating_xu1 天前
【内存管理发展史】从 8086 实模式到分页:CPU 如何把虚拟地址变成物理地址
linux·缓存
wdfk_prog1 天前
用 Git Submodule + Sparse Checkout 管理 RT-Thread:内核、BSP、第三方库与业务代码分层实践
运维·缓存·docker·容器·ros
努力努力再努力wz1 天前
【Docker入门系列】镜像为什么能复用?一文吃透 Docker Image、Registry、运行时架构与常用命令
缓存·docker·容器