【Redis】理论进阶篇------浅谈Redis的缓存穿透和雪崩原理

一、缓存穿透

1、概念

缓存穿透(查不到数据),是指当用户想要查询数据的时候,会先去Redis中取命中,如果Redis中没有该数据,那么就会向数据库中去查找数据。如果数据库中也没有,则该次查询结果失败。但是当我们的用户增多或者用户源源不断的发起请求,redis中也没有命中,全去访问了持久层数据库,这就会导致数据库造成很大的压力,这时候就相当于出现了缓存穿透。

如图所示:Client发送请求,若Redis中没有,就把所有请求转向MySQL数据库,当请求增多,MySQL压力增大,就会出现缓存穿透现象。

2、解决方法

①:布隆过滤器(BloomFilter)

布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,先在控制台进行校验,不符合则丢弃,从而避免对底层数据库的压力。

布隆过滤器作用是判断数据是否存在集合之中,正好和Redis这个缓存的场景相同,如图所示,当我们的数据到Redis之前先在BloomFilter检验,如果数据不符合规范,就丢弃,减少对数据库的压力。

②:缓存空对象

当存储层不被命中后,即使返回一个空对象也将其缓存起来,同时设置一个过期时间,之后再访问这个数据会从缓存中取,保护了后端的数据源。

缺点:

a.如果空值被缓存起来,则缓存需要更多的空间存储更多的键(会有更多空的键);

b.即使设置了过期的时间,还是会在缓存层和存储层的数据会有一段时间窗口不一致,这对需要保持一致性的业务会有影响。

二、缓存击穿

1、概念

缓存击穿(查询的量太大),是指一个key非常热点,在不断的扛着大并发,大并发集中的对这个点进行访问,当这个key在失效的瞬间,持续的大并发就穿透了缓存,直接请求数据库,由于是热点数据,数据量很大,在缓存过期的同时,大量数据访问我们数据库,并且回写到缓存,会导致数据库瞬间压力过大。

2、解决方法

①:设置热点数据永不过期

从缓存的层面来看,没有设置过期时间,所以不会出现热点key过期后产生的问题。

②:加互斥锁

分布式锁:使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有收获分布式锁的权限,因此只需要等到即可。这种方式将高并发的压力转移到了分布式锁上,因此对分布式锁的考验很大。如下图所示:

三、缓存雪崩

1、概念

缓存雪崩,是指在某一个时间段,缓存集中过期失效,redis宕机了。

如下图所示:

2、解决方法

①:Redis的高可用

既然redis可能挂掉,那我们就可以多设置几台redis,搭建一个集群,这样一来一台机器挂掉后其他的还可以继续工作。

②:限流降级

在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询寻数据和写缓存,其他线程等待。

③:数据预热

数据加热的含义就是正式部署之前,我们把可能的数据预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发前动手加载缓存中不同的key,设置不同的过期时间,让缓存的时间点尽量均匀。

四、总结

这部分的内容是对b站up主【狂神说Java】内容的总结,这里只是讲解了大概的原理,让大伙知道有这些情况,那后期呢,博主会再出一期详细的博客,讲解关于这些情况的具体实例以及一些相关算法讲解。如果对屏幕前的小伙伴有所帮助,不要忘记,点赞👍,支持博主一波哦!

相关推荐
一 乐16 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
1.14(java)18 小时前
SQL数据库操作:从CRUD到高级查询
数据库
Full Stack Developme18 小时前
数据库索引的原理及类型和应用场景
数据库
IDC02_FEIYA20 小时前
SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)
数据库·windows
辞砚技术录20 小时前
MySQL面试题——联合索引
数据库·面试
萧曵 丶20 小时前
MySQL 主键不推荐使用 UUID 的深层原因
数据库·mysql·索引
小北方城市网21 小时前
分布式锁实战指南:从选型到落地,避开 90% 的坑
java·数据库·redis·分布式·python·缓存
毕设十刻21 小时前
基于Vue的人事管理系统67zzz(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
ohoy21 小时前
RedisTemplate 使用之Zset
java·开发语言·redis
小夏卷编程1 天前
jeecg boot 路由缓存失效问题
vue.js·缓存