redis那点事6: 缓存问题篇 (缓存雪崩, 缓存击穿, 缓存穿透等)
redis大纲:
让我们来想想在实际开发过程中遇到的缓存问题有哪些?
1. 缓存雪崩
2. 缓存击穿
3. 缓存穿透
4. 缓存预热
5. 缓存更新
什么是缓存雪崩?
缓存雪崩是指, 当大量的缓存在同一时间失效, 所有的请求都会到数据库, 对DB和CPU造成巨大的压力,
那么就有可能造成数据库的宕机, 这就是缓存雪崩
如何解决缓存雪崩?
方案1: 设置互斥锁 mutex: 单机使用 lock 分布式使用setnx
方案2: 建立备份缓存, A 和 B, 当 A 过期后, 读取缓存 B 并且查询数据库更新 A 和 B
方案3: 设置缓存的时候加一个随机时间, 这样可以介绍计提时效的概率, 一定晨程度免了雪崩
方案4: 使用阻塞队列查询
什么是缓存穿透?
一般在恶意攻击的情况下: 当请求数据库不存在的数据时, 缓存肯定没有, 数据库也肯定没有,
这样请求会一直落到数据库, 造成数据库压力
如何解决缓存穿透?
方案1: 使用布隆过滤器, 储存 key 的 bitmap, 如果没有查询到key, 则直接被过滤
方案2: 当查询数据库为空时, 将空数据也写入redis, 并且设置较短的过期时间
什么是缓存击穿?
一个存在的 key, 在失效的一瞬间, 同时大量请求并发, 这些请求都会击穿到数据库, 对数据库造成压力
如何解决缓存击穿?
方案1: 设置互斥锁 mutex: 单机使用 lock 分布式使用setnx
方案2: 异步构建缓存
什么是缓存预热?
缓存预热就是在系统上线前将相关的缓存数据直接加载到redis, 避免了缓存首次未命中,
大型活动或秒杀活动都需要提前预热
如何处理缓存预热?
方案1: 直接写个单元测试, 上线的时候手动操作一下
方案2: 如果数据量不大, 可以在项目上线之后直接加载
方案3: 定时器进行缓存刷新
什么是缓存更新?
除了redis自带的6中缓存数据淘汰策略外, 我们需要根据业务需求定义自己的缓存淘汰策略
如何处理缓存更新?
策略1: 定时清理过期的缓存
策略2: 有请求进来时, 先判断缓存中的数据时候过期, 过期了就去得到新数据并更新
策略1 缺点是维护大量 key 很麻烦
策略2 缺点是每次请求都要判断 key 是否存在, 逻辑上麻烦
解决实例
解决实例会在下一篇博客讲述: 传送
结束
这就是我对redis缓存问题篇的总结 感觉有用就点个赞吧 如果有错误或更好的方法评论区请多多指出 相互学习共同进步
- Redis缓存相关问题(雪崩、穿透、击穿、并发)
- 关于【缓存穿透,缓存击穿,缓存雪崩,热点数据丢失】问题的解决方案
- 【BigHereo 53】---Redis遇到的问题---雪崩,击穿,穿透
- Redis缓存穿透、缓存雪崩、redis并发问题分析
- Redis缓存穿透、缓存雪崩、redis并发问题分析
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
- Redis缓存穿透、缓存雪崩、redis并发问题分析
- Redis关于缓存雪崩和缓存穿透等问题
- 关于缓存穿透,缓存击穿,缓存雪崩,热点数据失效问题的解决方案
- 缓存的穿透、击穿、以及雪崩问题的解决方案
- Redis 缓存穿透、缓存雪崩、热点Key问题分析和解决方案
- Redis总结(五)缓存雪崩和缓存穿透等问题
- 缓存穿透,缓存击穿,缓存雪崩解决方案分析
- REDIS (13) 缓存的穿透,雪崩和热点key
- redis的缓存穿透和缓存雪崩
- 缓存穿透,缓存击穿,缓存雪崩解决方案分析
- 实例解读什么是Redis缓存穿透、缓存雪崩和缓存击穿
- 缓存穿透,缓存击穿,缓存雪崩解决方案分析
- 缓存穿透和缓存雪崩的预防和解决-Redis
- 关于Redis中缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等概念的入门及简单解决方案