redis缓存穿透、缓存击穿、缓存雪崩

redis缓存穿透、缓存击穿、缓存雪崩区别和解决方案#

缓存穿透

描述:

缓存穿透是指**缓存和数据库中都没有的数据**,而用户不断发起请求。由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。

在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

缓存击穿

描述:

*缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期)*,这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

解决办法:

1.2.1 互斥锁
解释:

如果未命中缓存,先获取互斥锁,获取锁之后要再次检查缓存,如果还是未命中进行缓存重建,这样当其他线程来的时候就会获取锁失败,这时我们让这个线程休眠一会,重新查询缓存,如果命中就返回嘛,如果没命中再次尝试获取锁,假设这次获取锁成功了,还是再次检查缓存,如果未命中重建缓存。

在获取锁以后需要再次检测缓存,防止其他获取失败锁的线程B,再次获取锁以后又进行了缓存重建。
优点:可保证数据高一致性

缺点:性能低,可能发生死锁

1.2.2 逻辑过期
解释:

为缓存key设置逻辑过期时间(就是加一个字段),假设线程1查询缓存,未命中直接返回,命中判断是否过期发现,没过期也好说直接返回数据就行,已过期,就会尝试获取锁,然后此刻开启新的线程进行缓存重建,线程1返回旧数据,其他线程获取锁失败都返回旧数据。

优点:性能高

缺点:数据可能不一致,实现复杂

缓存雪崩

描述:

缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

缓存雪崩除了使用随机TTL还有没有其他的解决方案。(分为事前事中事后)

缓存雪崩是指在同一时刻大量缓存失效,导致大量请求直接访问数据库,从而对数据库造成巨大压力,甚至可能导致数据库崩溃的情况。以下从事前、事中、事后三个阶段,详细介绍除随机 TTL 之外的其他解决方案:

事前预防#

1. 缓存集群化与高可用

  • Redis 主从复制与哨兵机制:通过配置多个 Redis 节点,一个主节点负责写操作,多个从节点负责读操作。同时引入哨兵机制,它会持续监控主从节点的状态。当主节点出现故障时,哨兵会自动将一个从节点升级为主节点,实现故障自动转移,确保 Redis 服务的高可用性,避免因单个节点故障引发缓存雪崩。
  • Redis 集群:采用分片的方式将数据分散存储在多个节点上,提高了系统的可扩展性和可用性。即使部分节点出现故障,整个集群仍然可以正常工作,减少了因节点故障导致大量缓存丢失的风险。

2. 数据预热

在系统启动前,将一些常用的数据预先加载到 Redis 缓存中。可以编写专门的脚本,在系统启动时执行缓存预热操作。这样可以避免在系统刚启动时,大量请求直接访问数据库,减少缓存雪崩的可能性。例如,对于电商系统,可以在启动时将热门商品的信息加载到缓存中。

3. 限流与熔断规则预设

  • 限流:对访问数据库的请求进行限流,防止过多的请求同时涌入数据库。可以使用令牌桶算法或漏桶算法实现限流。例如,在系统设计阶段,根据数据库的处理能力,设置每秒允许的最大请求数。
  • 熔断:引入熔断机制,预先设置好熔断的阈值,当数据库的请求响应时间过长或者错误率过高时,自动切断对数据库的访问,直接返回默认值或错误信息。可以使用 Hystrix 等开源库实现熔断功能。

事中应对#

1. 多级缓存架构

采用多级缓存架构,例如在 Redis 之前添加本地缓存(如 Guava Cache)。当 Redis 缓存失效时,先从本地缓存获取数据。本地缓存可以存储一些热点数据,减少对 Redis 的依赖,降低数据库的压力。同时,在更新数据时,需要注意多级缓存之间的数据一致性。

2. 异步加载缓存

当发现大量缓存失效时,采用异步方式重新加载缓存。在请求到达时,如果发现缓存失效,先返回旧数据(如果有)或者默认值,同时启动一个异步线程去重新加载缓存。这样可以保证系统的响应速度,避免大量请求阻塞。

3. 服务降级

当发生缓存雪崩时,对一些非核心业务的缓存进行降级处理。例如,返回默认值、空数据或者提示信息,保证核心业务的正常运行。比如在电商系统中,对于一些商品的推荐信息可以暂时不显示,优先保证商品详情页等核心业务的正常访问。

事后恢复#

1. 缓存重建

在缓存雪崩发生后,需要尽快重建缓存。可以通过批量处理的方式,从数据库中读取数据并重新写入 Redis 缓存。同时,可以根据数据的热度和重要性,优先重建热点数据的缓存。

2. 系统监控与优化

对系统进行全面的监控和分析,找出导致缓存雪崩的原因,例如是否是缓存过期时间设置不合理、Redis 节点故障等。根据分析结果,对系统进行优化,调整缓存策略、加强 Redis 集群的监控和维护等,避免类似问题再次发生。

3. 数据备份与恢复

定期对 Redis 缓存数据进行备份,以便在缓存雪崩发生后能够快速恢复数据。可以使用 Redis 的 RDB 或 AOF 持久化机制进行数据备份。如果 Redis 数据丢失,可以通过备份文件进行恢复。

作者:Esofar

出处:https://www.cnblogs.com/firsthelloworld/p/18657511

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   我不想学编丿程  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示