缓存穿透,缓存击穿,缓存雪崩 是什么 如何处理

缓存穿透,缓存击穿,缓存雪崩

通常我们使用缓存中间件的方式 将数据库的热点数据缓存到Redis中 尽量去缓存中查找数据,目的就是为了减轻数据库的压力

image-20220311204750451

那什么是 缓存穿透,缓存击穿 与 缓存雪崩 呢 ?

缓存穿透

当Redis中不存在某个key时,将对数据库进行查询操作 但如果数据库也不存在 就会造成每一个请求即查询redis也会查询数据库 这就是缓存穿透

image-20220311205718308

比如说一个查询接口 查询范围在 1~1000 但是遇到不怀好意的用户 大量请求 1000 ~ ... 查询不存在的信息

将给数据库造成巨大的压力 并且Redis缓存形同虚设了

解决办法

一般处理办法有两种

方式一 : 利用布隆过滤器 首先将Redis中的key全部添加到布隆过滤器中 布隆过滤器判断不存在的一定Redis中也没有 可以过滤掉绝大部分恶意请求 但是 布隆过滤器不是百分百正确的 判断有的 可能redis中也不存在

方式二: 缓存空值

当从数据库中没有查询到数据的时候,也给redis中缓存一个空值 并且返回这个空值 这样下次同样信息的请求过来时,redis就能直接处理不用再去查询数据库了

缓存击穿

当某一个时刻 redis中某一个 热点 Key 过期,大量的并发请求打到数据库上 可能造成数据库崩溃 打在一个点上 这就是缓存击穿

缓存击穿 与 缓存穿透的区别在于 缓存击穿是Redis中过期,数据库中有 而 缓存穿透是Redis中没有,数据库中也没有

image-20220311210842094

缓存击穿最大的问题在于大量请求发现Redis中的数据找不到了,要去数据库中查找,而数据库中是有数据的 所以我们只需要控制请求数

放一个请求去查询数据库,查到数据后,将数据写回 Redis 此时再放其他请求去查询Redis , 此时Redis已经有了相应的数据

解决办法

加分布式锁 可以使用 Redis 或者 Mysql 都行 Redis做分布式锁相对简单

判读key是否存在,不存在则创建key,value,同时设置过期时间,防止死锁 要保证原子性 调用 setIfAbsent 方法

 //原子操作 设置 UUID 与 过期时间 30 秒             Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(RedisConst.SKUKEY_LOCK + skuId, uuid, 30, TimeUnit.SECONDS);

key 设置前缀和标识 value设置成锁持有者的唯一标识 防止锁过期后误删其他线程的锁

缓存雪崩

缓存雪崩 同一时间Redis中大量热点key过期 造成数据库处理大量请求最后崩溃

相比缓存击穿 过期的热点key数量更多

解决办法

设置热点key过期时间时,添加一个随机值 避免同一时间过期

#java求职##学习路径#
全部评论
你的标题让我想到了二极管的雪崩击穿
点赞 回复 分享
发布于 2022-03-14 19:46

相关推荐

2025-12-28 13:01
门头沟学院 Java
timeline: 8/3 HR打电话,9/4一面,9/17二面,10/10三面一面:项目拷打八股:讲讲你对串行、并行、并发的理解?有哪些进程调度算法?从输入url到页面渲染,在网络层面都发生了什么?TCP怎么保证可靠性?什么是数据库的事务?ACID是什么?介绍一下MVCC慢查询如何优化?如何判断是否命中索引,explain看什么字段?MYSQL锁的类型什么情况下会发生死锁?哪些方式可以避免死锁?REDIS底层有哪些数据结构?线程池了解吗?核心参数有哪些?Spring怎么解决循环依赖?最近有在学什么技术上的东西吗?对哪块技术比较熟悉?HashMap底层实现?HashMap在并发情况下可能会有什么问题?AQS是什么,原理是什么?算法:lc22. 括号生成其他:未来2-3年的规划对方向有什么倾向?学习一个新东西的学习思路是什么?理论知识怎么学?二面:项目拷打八股:MySQL是如何控制和管理事务的?可重复读是怎么实现的?MySQL的索引类型及其区别是什么?你会怎么设计联合索引?什么是区分度较大的字段?数据库深分页的问题怎么解决?TCP是怎么做拥塞控制的?TCP如何判断发生了拥塞?一个http请求一层层往下数据是怎么封装的?数据包比较大,每一层是怎么拆的?TCP层会拆包吗?TCP发送的数据会导致IP层拆包吗?TCP的缓冲区大小如何确定,会不会超过IP层的1500B?TCP连接的时候,每次能发送的大小是怎么写上的?介绍一下虚拟内存进程和线程的区别是什么?linux进程调度算法有哪些?操作系统怎么处理IO调用的?系统调用中断过程是什么?算法题:lc148. 排序链表三面:项目拷打了很久一直在问我做的优化有没有什么理论支撑但项目都是跑case看正确性lc143 重排链表,要求空间复杂度O(1)其他问了成绩之类的问题反问三面的时候项目讲的有点抽象,面试官听不懂面试官没有听到想听的理论基础三面挂了
点赞 评论 收藏
分享
评论
3
27
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务