Redis中穿透、雪崩、击穿的理解与解决方案

Redis充当缓存:

一、缓存穿透:(要查询的数据根本不存在)

根本原因:请求根本不存在的资源

举例:客户端发送大量的不可响应的请求

当大量的客户端发送大量的不可响应的请求 ,就可能导致出现缓存穿透的情况。因为数据库DB中本身就没有该请求的数据,所以Redis也没有对应的数据,那么这些请求在redis就得不到响应,就会直接打在DB上,导致DB压力过大而卡死情景在线或宕机

解决方案:

(1)对空值进行缓存

类似于上面的例子,虽然数据库中没有该请求的数据,但是在redis中对他进行缓存(key=xxx,value=null),这样当请求到达redis的时候就会直接返回一个null的值给客户端,避免了大量无法访问的数据直接打在DB上。

(2)实时监控

对redis进行实时监控,当发现redis中的命中率下降的时候进行原因的排查,配合运维人员对访问对象和访问数据进行分析查询,从而进行黑名单的设置限制服务。

(3)使用Boolean过滤器

使用BitMap作为布隆过滤器,将目前所有可以访问到的资源通过简单的映射关系放入到布隆过滤器中(哈希计算),当一个请求来临的时候先进行布隆过滤器的判断,如果有那么才进行放行,否则就直接拦截。

(4)接口校验

类似于用户权限的拦截,对于无效访问就直接拦截,不允许这些请求到达Redis、DB上。

二、缓存雪崩

**产生的原因:**redis中大量的key集体过期

举例:当redis中的大量key集体过期,可以理解为redis中的大部分数据都被清空了(失效了),那么这时候如果有大量并发的请求来到,那么redis就无法进行有效的响应(命中率急剧下降),请求就都打到DB上了,到时DB直接崩溃。

解决方案:

  1. 使用互斥锁(Mutex Lock)或分布式锁,只允许一个请求去访问后端数据源,其他请求等待并共享结果。(推荐使用)

  2. 将失效时间分散开, 通过使用自动生成随机数使得key的过期时间是随机的,防止集体过期

  3. 使用多级架构,使用nginx缓存+redis缓存+其他缓存,不同层使用不同的缓存,可靠性更强

  4. 设置缓存标记,记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去更新实际的key

  5. 设置热点数据的永远不过期或过期时间较长,以减少热点数据失效的机会。

三. 缓存击穿

产生的原因:redis中的某个热点key过期,但是此时有大量的用户访问该过期key。

比如:某个热搜很火,这时候大家都在访问该热点事件,但是可能由于某种原因,redis的这个热点key过期了,那么这时候大量高并发对于该key的请求就得不到redis的响应,那么就会将请求直接打在DB服务器上,导致整个DB瘫痪。

解决方案:

  1. 为缓存数据设置不同的过期时间,使其在不同时间点过期,避免集中失效。监控数据,适时调整,监控哪些数据是热门数据,实时的调整key的过期时长

  2. 引入两级缓存架构,例如使用本地缓存(如Guava Cache)作为第一级缓存,并设置较短的过期时间,Redis作为第二级缓存,并设置较长的过期时间。

  3. 针对热点数据,可以提前进行预加载,保证其缓存不会在同一时间全部失效。

相关推荐
OceanBase数据库官方博客5 分钟前
深度拆解seekdb:AI Native Database 的技术架构与核心能力
数据库·人工智能·架构
爱吃鱼的喵️18 分钟前
云数据库怎么选?主流云厂商横向对比与选型指南
数据库·阿里云·云计算
维克兜率天18 分钟前
4.3.2.1 日常监控:上线只是开始
服务器·数据库·python·区块链·php·量化
AIGS00136 分钟前
工艺参数散在Excel和纸质文件里,能不能统一管、随查随用
服务器·数据库·excel·经验沉淀·知识管理·工艺知识·本体语义
裕晟资质规划37 分钟前
军工保密资质二级申报的四个可量化硬条件:条文位置、数值口径与西安配套企业实务要点
java·服务器·网络·数据库·算法
子非鱼a1 小时前
【WEB】October 2019 Twice SQL Injection
数据库·sql
Elastic 中国社区官方博客1 小时前
Elasticsearch:ES|QL 搜索教程
大数据·数据库·人工智能·sql·elasticsearch·搜索引擎·全文检索
喂自己代言1 小时前
从 0.7 秒到 11 毫秒:OceanBase 一条慢 SQL 的三连坑优化实战
数据库·sql·oceanbase
哈__1 小时前
KES-Operator正式发布:基于Kubernetes的数据库集群云原生全生命周期管理方案
数据库·云原生·kubernetes
鸽芷咕1 小时前
金仓KES向量数据库实战:一条SQL干掉ETL,机器人不再把停产货当现货卖
数据库·sql·etl