Redis 缓存击穿和缓存穿透、缓存雪崩是什么以及解决方案有哪些?

一、基本概念

(1)缓存穿透(Cache Penetration):指查询一个不存在的数据(缓存和数据库中都没有),由于缓存中没有数据,所以这个查询请求会直接穿过缓存层,到达数据库层,造成了数据库的压力。攻击者可以通过构造恶意请求,使得缓存层无法命中任何数据,从而导致请求直接访问数据库,从而引起数据库压力过大。

(2)缓存击穿(Cache Breakdown):指缓存中没有但数据库中有的数据,当缓存中某个热点数据失效,此时有大量并发请求同时访问这个失效的热点数据,导致这些请求直接访问数据库,造成数据库压力过大,甚至导致数据库溃。通常是由于缓存中某个热点数据过期失效, 同时有大量并发请求访问该数据。

(3)缓存雪崩(Cache Avalanche):指缓存中大量的数据提供是失效,导致大量请求直接访问数据库,造成数据库压力过大。通常是由于缓存中大量的数据在同一时间失效,导致大量请求直接访问数据库。

二、解决方案

(1)缓存穿透:

  1. 使用BloomFilter布隆过滤器,先检查数据是否存在。

  2. 如果查询结果为空,可以设置一个短暂的缓存,避免请求再次打到数据库。

(2)缓存击穿:

  1. 设置热点数据永不过期。

  2. 使用分布式锁,只有获取锁的节点可以查询数据库,其他节点等待。

  3. 提供一个能处理热点key的服务,预先加载数据。

(3)缓存雪崩:

  1. 不同的key设置不同的过期时间(例如设置过期时间为随机时间),分散缓存失效时间,避免在同一时间大量数据同时失效。

  2. 另外可以在缓存层和数据库层之间添加限流、熔断等措施,避免因突发流量导致系统崩溃。

  3. 实现Redis高可用,确保服务的可用性。

  4. 提前预热缓存,或者使用锁或队列控制缓存构建。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 20:12:06       49 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 20:12:06       53 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 20:12:06       42 阅读
  4. Python语言-面向对象

    2024-07-09 20:12:06       53 阅读

热门阅读

  1. php简单实现利用飞书群里机器人推送消息的方法

    2024-07-09 20:12:06       21 阅读
  2. 终于弄明白了什么是EI!

    2024-07-09 20:12:06       19 阅读
  3. 期货量化交易:探索金融投资的新领域

    2024-07-09 20:12:06       25 阅读
  4. 探索金融数据API:现代投资的关键工具

    2024-07-09 20:12:06       23 阅读
  5. uniApp 封装VUEX

    2024-07-09 20:12:06       18 阅读
  6. H5与小程序:两者有何不同?

    2024-07-09 20:12:06       19 阅读
  7. 论文引用h指数

    2024-07-09 20:12:06       27 阅读
  8. 强化学习(Reinforcement Learning,简称RL)

    2024-07-09 20:12:06       26 阅读