首页 > 数据库 >【性能测试】Redis中的缓存雪崩、缓存击穿、缓存穿透问题详解

【性能测试】Redis中的缓存雪崩、缓存击穿、缓存穿透问题详解

时间:2024-02-26 23:34:27浏览次数:30  
标签:缓存 请求 击穿 数据库 Redis 穿透 详解 数据

一. 什么是缓存雪崩

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

1.1 缓存雪崩的成因

  1. 大量缓存同时设置相同的过期时间:如果在某一时刻设置了大量的缓存数据,并为它们都设置了相同的过期时间,那么在未来的某一时刻,这些缓存数据都会同时失效。

  2. Redis宕机:如果因为某种原因,Redis服务器突然宕机,那么所有的缓存数据都会消失,导致所有的请求都直接访问数据库。

  3. 误删缓存数据:如果由于某种原因,大量的缓存数据被误删除,那么也会引发缓存雪崩。

1.2 如何预防缓存雪崩

  1. 设置随机过期时间:为了防止大量的缓存同时失效,我们可以为每个缓存设置一个随机的过期时间,这样就可以确保不会有太多的缓存同时失效。

  2. 使用熔断机制:在系统中加入熔断机制,当数据库请求到达一定的阈值时,直接拒绝部分请求,以保护数据库不被过度访问。

  3. 双层缓存策略:可以使用两层缓存,一层是热数据的缓存,另一层是冷数据的缓存。热数据缓存失效后,可以先访问冷数据缓存,而不是直接访问数据库。

  4. 数据预热:在系统启动后,预先加载部分常用的数据到缓存中,减少在高峰期的数据库访问。

  5. 使用高可用架构:如使用Redis的哨兵模式或者集群模式,确保Redis服务的高可用。

  6. 备份和恢复策略:定期备份Redis数据,并确保在Redis宕机后,可以快速恢复数据。

二. 什么是缓存穿透?

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

2.1 导致缓存穿透的原因

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

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

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

2.2 缓解缓存穿透的方法

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

  2. 空结果缓存:对于数据库中不存在的数据,也将其缓存起来,但设置一个较短的过期时间,避免大量的无效请求直接访问数据库。

  3. 合理设置缓存时间:根据业务场景,合理设置缓存时间,避免缓存数据过早失效导致大量请求穿透。

三. 什么是缓存击穿?

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

3.1 缓存穿透与缓存击穿的区别

  • 缓存穿透 是指请求一个不存在于缓存中的数据,导致每次请求都直接查询数据库。

  • 缓存击穿 是指大量请求同时请求一个不存在于缓存中的数据,导致数据库压力骤增。

3.2 缓存击穿的原因

缓存击穿通常发生在以下情况下:

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

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

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

3.3. 解决缓存击穿问题

  • 使用互斥锁: 通过在缓存中设置互斥锁,只允许一个线程查询数据库,其他线程等待结果。这可以防止多个请求同时穿透到数据库。

  • 预加载数据: 在缓存中设置数据预加载,避免等待请求引发缓存击穿。这需要定期刷新缓存,确保热门数据始终可用。

  • 布隆过滤器: 使用布隆过滤器检查请求的数据是否存在于缓存中,如果不存在,不查询数据库。这可以减少数据库查询次数。

  • 优化数据库查询: 优化数据库查询性能,减少查询时间,可以降低缓存击穿的风险。使用合适的索引和查询优化策略。

 

参考笔记:https://www.cnblogs.com/lazyfiish/p/16086623.html

标签:缓存,请求,击穿,数据库,Redis,穿透,详解,数据
From: https://www.cnblogs.com/xfbk/p/18035840

相关文章

  • CentOS下安装redis 详细步骤
    1、前言Redis版本6.2.5服务器版本LinuxCentOS7.664位2、下载Redis下载网址:https://redis.io/download/笔者使用wget在线下载wgethttp://download.redis.io/releases/redis-6.2.5.tar.gz3、解压、安装3.1使用tar解压压缩包tar-xzvfredis-6.2.5.tar.gz3.2......
  • ELKF日志系统搭建(二)进阶——使用 Kafka 作为日志消息缓存
    说明:在一些比较大的业务使用场景中,因为应用繁多,需要收集的日志也很多,通过filebeat或者logstash收集上来的日志如果全都直接发送给ES,那么就会对ES集群产生一定的压力,为了避免出现日志接收不过来的问题,于是引入了消息队列作为缓存,比如常见的使用Redis或Kafka作为消息缓存......
  • 核心子方法2: obtainFreshBeanFactory()方法详解
    先总结: 该方法new了一个beanFactory, 设置了一些忽略的接口, 加载并解析了bean.xml, 主要将bean信息解析为BeanDefinition保存到beanFactory中1.refreshBeanFactory()方法 1.1创建DefaultListableBeanFactory对象: createBeanFactory()->newDefaultListableBeanF......
  • redis自学(5)QuickList
    问题1:ZipList虽然节省内存,但申请内存必须是连续空间,如果内存占用较多,申请内存效率很低。怎么办?为了缓解这个问题,我们必须限制ZipList的长度和entry大小。问题2:但是我们要存储大量数据,超出了ZipList最佳的上限怎么办?我们可以创建多个ZipList来分片存储数据。问题3:数据拆分后比......
  • redis常见的五种类型
    https://www.cnblogs.com/xkqwy/p/16353029.html 总结1.string类型写命令通过set关键字实现,set[key][value]读命令通过get关键字实现,get[key]2.list列表类型通过rpush、lpush,将一个或多个值向右或向左推入。rpush[key][value1][value2],将value值推入到列表的右端......
  • 详解SSL证书系列(1)什么是SSL证书?
    你一定遇到过这种情况,打开一个网站,浏览器弹出警告”您与此网站之间建立的连接不安全。由于此连接不安全,因此信息(如密码或信用卡)不会安全地发送到此网站,并且可能被其他人截获或看到”。细心的你也一定关注到,有的网址是https开头的,有的是http。https开头的网站前面,会有一把小锁。......
  • JavaScript中的包装类型详解
    JavaScript中的包装类型详解在JavaScript中,我们有基本类型和对象类型两种数据类型。基本类型包括String,Number,Boolean,null,undefined和Symbol。然而,当我们需要在这些基本类型上调用方法时,就需要用到JavaScript的包装类型。什么是包装类型?包装类型是JavaScript中的......
  • Redis扩展数据类型&命令
    StreamRedisStream是Redis5.0版本引入的一种新的数据类型,它是一个持久化的、可查询的、可扩展的消息队列服务。Stream类型的数据结构类似于一个日志系统,数据被添加到Stream的末尾,并且每个数据都会被分配一个唯一的序列号,这个序列号是按照时间顺序递增的。主体队列:Stre......
  • 在Docker中设置Redis的密码
    目录1,介绍2,实现“DockerRedis设置密码”的整体流程3,具体实现步骤4,结论1,介绍Docker是一个开源的应用容器引擎,可以自动化部署、扩展应用程序。它可以帮助开发人员将应用程序及其依赖项打包到一个可移植的容器中,然后在任何环境中运行。Redis是一个开源的内存数据结构存储系统,它可以......
  • BFC详解
    1.问题1.1BFC作用一:可以取消盒子margin塌陷计算BFC的高度时,考虑BFC所包含的所有元素,连浮动元素也参与计算1.2BFC作用二:可以阻止该元素被浮动元素覆盖浮动盒区域不叠加到BFC上!!!这是BFC的独立性主要应用于一行中同时存在浮动元素和行内元素,防止行内元素被覆盖(不常用,一般一行均......