您的位置:首页 > 数据库 > Redis

redis那点事6: 缓存问题篇 (缓存雪崩, 缓存击穿, 缓存穿透等)

2019-05-02 00:07 816 查看

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缓存问题篇的总结  感觉有用就点个赞吧 如果有错误或更好的方法评论区请多多指出  相互学习共同进步

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐