Redis中的缓存雪崩、缓存击穿、缓存穿透问题

什么是缓存雪崩(缓存时效)

缓存雪崩是指在某一时刻发生大量的缓存失效,导致瞬间大量的请求直接打到了数据库,可能会导致数据库瞬间压力过大甚至宕机。尤其在高并发的系统中,这种情况会导致连锁反应,整个系统可能会崩溃。

雪崩的原因

  • 大量缓存同时设置相同的过期时间:如果在某一时刻设置了大量的缓存数据,并为它们都设置了相同的过期时间,那么在未来的某一时刻,这些缓存数据都会同时失效。
  • 如果因为某种原因,Redis服务器突然宕机,那么所有的缓存数据都会消失,导致所有的请求都直接访问数据库。
  • 误删缓存数据:如果由于某种原因,大量的缓存数据被误删除,那么也会引发缓存雪崩。

如何预防缓存雪崩

  • 设置随机过期时间:了防止大量的缓存同时失效,我们可以为每个缓存设置一个随机的过期时间,这样就可以确保不会有太多的缓存同时失效
  • 使用熔断机制:在系统中加入熔断机制,当数据库请求到达一定的阈值时,直接拒绝部分请求,以保护数据库不被过度访问。
  • 双层缓存策略:可以使用两层缓存,一层是热数据的缓存,另一层是冷数据的缓存。热数据缓存失效后,可以先访问冷数据缓存,而不是直接访问数据库。
  • 数据预热:在系统启动后,预先加载部分常用的数据到缓存中,减少在高峰期的数据库访问。

什么是缓存穿透(访问不存在的数据,比如查询id为负一的数据)

缓存穿透是一种指请求查询一个不存在的数据,由于缓存层不存在这个数据,所以请求会穿过缓存层直接查询数据库,导致数据库压力增加。缓存穿透通常发生在恶意攻击或者系统设计不当的情况下。

导致缓存穿透的原因

  • 恶意攻击:攻击者有意请求不存在的数据,以使得系统频繁访问数据库,造成拒绝服务攻击。

  • 大量请求:如果一个不存在的热点数据被大量请求,会导致这些请求穿透缓存层直接访问数据库,增加数据库压力。

  • 缓存数据失效不及时:当缓存中的数据未及时更新或失效,而恰好有大量请求访问这部分失效的数据时,也会导致缓存穿透问题。

解决办法

  • 布隆过滤器:在缓存层前使用布隆过滤器,对所有可能的数据建立一个布隆过滤器,用于快速判断一个请求的数据是否存在于数据库中。

  • 空结果缓存:对于数据库中不存在的数据,也将其缓存起来,但设置一个较短的过期时间,避免大量的无效请求直接访问数据库。比如设置set(key,null),30s过期。

什么是缓存击穿(高并发时缓存时效)

缓存击穿是指在高并发环境下,大量请求同时访问缓存中不存在的数据,导致这些请求穿透到数据库。这会对数据库造成严重的压力,降低性能。

电商平台经常需要需要考虑的就是当某个时间点流量爆发的时候,带来的系统不稳定性,如雪崩效应。

一般来讲,请求热点数据时都是从缓存中读取,可当某个商品做促销时,缓存中第一开始没有数据,如果这个时候并发100w请求,因为缓存中没有数据,所以会击穿缓存到达基础服务,甚至请求数据库,这是比较危险⚠️都,可能直接带来基础服务都瘫痪!

为了解决这种情况,所有都热点数据都必须先进行缓存预热, 即先发布热点信息存入缓存。

1:缓存预热 进行缓存预热,这是一种避免性措施。
2:热点key加锁 当高并发时,为了保护后台基础服务,可对热点数据加锁,即只有一个线程去后台访问基础服务,其他线程都等待。

String get(string key){
    string value = redis.get(key);
    if(null == value){
        if(redis.setnx(key_mutex,"1")){
            redis.expire(key_mutex,3*60);
            value = db.get(key);
            redis.set(key,value);
            redis.delete(key_mutex);
        }else{
            Thread.sleep(50);
            get(key);
        }
    }
}

此种方法相当于为热点数据加锁,当热点数据失效时,只有一个线程去后台访问数据,达到了保护后台服务的目的。
3:设置热点数据永不过期

缓存击穿的原因

  • 热点数据:某个数据非常热门,但缓存中没有。

  • 缓存失效:缓存中的数据过期,但大量请求仍在访问。

  • 同时到期:多个数据同时过期,导致并发查询数据库。

解决办法

相关推荐

  1. Redis缓存雪崩缓存击穿缓存穿透问题

    2024-03-28 05:18:04       22 阅读
  2. Redis缓存击穿缓存雪崩缓存穿透

    2024-03-28 05:18:04       33 阅读
  3. redis缓存击穿缓存穿透缓存雪崩

    2024-03-28 05:18:04       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-28 05:18:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-28 05:18:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-28 05:18:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-28 05:18:04       20 阅读

热门阅读

  1. PTA------ 敲笨钟

    2024-03-28 05:18:04       22 阅读
  2. Filter和Intercepter中怎么获取Spring托管的bean对象

    2024-03-28 05:18:04       17 阅读
  3. yolov8 在训练好的模型基础上切换为中文标签

    2024-03-28 05:18:04       21 阅读
  4. 面向对象编程(一)

    2024-03-28 05:18:04       19 阅读
  5. 实现阻塞队列

    2024-03-28 05:18:04       18 阅读
  6. Scikit-learn 数据挖掘和数据分析工具的使用指南

    2024-03-28 05:18:04       23 阅读
  7. Ubuntu搭建环境Cmake-Libtorch-Torchvision-PCL-VTK-OpenCV

    2024-03-28 05:18:04       25 阅读
  8. 当前项目下包的管理(添加和删除)

    2024-03-28 05:18:04       19 阅读
  9. uniapp保留两位小数,整数后面加.00

    2024-03-28 05:18:04       18 阅读
  10. docker基础(一)

    2024-03-28 05:18:04       18 阅读
  11. 机器学习和神经网络8

    2024-03-28 05:18:04       18 阅读
  12. vscode 系列文章目录 - c/c++插件配置头文件定义

    2024-03-28 05:18:04       20 阅读