【Redis】什么是缓存穿透、击穿、雪崩?如何解决?

embedded/2025/3/19 12:59:00/

1.缓存穿透

定义:

缓存穿透是指查询一个不存在的数据,由于缓存中没有该数据,请求会直接落到数据库。如果大量这样的请求同时发生,数据库可能会被压垮。

原因:

  • 恶意攻击: 攻击者故意请求大量不存在的数据。
  • 业务逻辑问题:某些查询条件本身就不存在有效数据。

解决方案:

1.缓存空值:

  • 如果查询结果为空,扔将空值缓存起来,并设置一个较短的过期时间。
if (data == null) {cache.put(key, "NULL", 60); // 缓存空值,过期时间为 60 秒
}

2.布隆过滤器(Bloom Filter):

使用布隆过滤器预先判断数据是否存在。如果布隆过滤器认为数据不存在,则直接返回,避免查询数据库

if (!bloomFilter.mightContain(key)) {return null; // 数据肯定不存在
}

3.接口层校验:

  • 在接口层请求参数进行校验,过滤掉明显非法的请求。

2.缓存击穿:

定义:

缓存击穿是指某个热点数据缓存过期后,大量请求同时涌入,直接访问数据库,导致数据库压力骤增。

原因:

  • 热点数据突然失效
  • 大量请求同时访问该数据。

解决方案:

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

  • 对于热点数据,可以设置永不过期,或者定期异步更新缓存

2.互斥锁

  • 缓存失效时,使用分布式锁(如Redis的SETNX) 确保只有一个线程去查询数据库并更新缓存,其他线程等待。
if (cache.get(key) == null) {if (lock.tryLock()) { // 获取锁try {// 查询数据库并更新缓存cache.put(key, value);} finally {lock.unlock(); // 释放锁}} else {// 等待缓存更新完成Thread.sleep(100);return cache.get(key);}
}

3.提前更新缓存

3.缓存雪崩:

定义:

缓存雪崩是指大量缓存数据在同一时间过期,导致大量请求直接访问数据库数据库压力骤增,直接崩溃。

原因:

  • 缓存数据设置了相同的过期时间。
  • 缓存服务宕机。

解决方案:

1.设置不同的过期时间:

  • 缓存数据设置随机的过期时间,避免大量缓存同时失效。
int expireTime = 60 + new Random().nextInt(60); // 过期时间在 60-120 秒之间
cache.put(key, value, expireTime);

2.缓存高可用:

  • 使用Redis集群主从复制,确保缓存服务的高可用性。
  • 比如:使用Redis Sentinel或Redis Cluster

3.限流和降级:

  • 缓存失效时,使用限流(如令牌桶算法)和降级策略,保护数据库

4.多级缓存

if (localCache.get(key) != null) {return localCache.get(key);
} else if (distributedCache.get(key) != null) {localCache.put(key, distributedCache.get(key));return distributedCache.get(key);
} else {// 查询数据库并更新缓存
}

总结:

请添加图片描述


http://www.ppmy.cn/embedded/173864.html

相关文章

4.从GitHub拉取远程分支到本地

要从GitHub拉取远程分支到本地,可以按以下步骤操作: 1. 方法一:直接拉取并切换到分支 适用场景 远程分支已存在(例如 feature/new-ui),需拉取到本地并自动跟踪。 拉取所有远程分支信息(确保本…

Qt 读取数据库

在 Qt 中读取数据库文件通常涉及以下步骤。这里以 SQLite 为例(Qt 内置支持),其他数据库(如 MySQL、PostgreSQL)需要对应驱动: 1. 添加 SQL 模块依赖 在项目文件 .pro 中添加: QT sql2. 基本…

Python 基础知识整理笔记

闹麻了,因为各种原因,现在需要重新回顾一下Python,话不多说,开始吧 1. Python是解释型语言 && Python与C代码执行过程的区别: (1)C 源码(Source):C的…

【gopher的java学习笔记】本地调试时配置Feign接口URL的实用指南

在微服务架构中,Feign作为声明式HTTP客户端简化了服务间调用,但在本地开发调试时,常因服务未注册到注册中心或需要绕过服务发现直接访问特定实例,需手动配置Feign的URL。本文将介绍三种主流配置方式,帮助开发者灵活应对…

软考网络安全专业

随着信息技术的迅猛发展,网络安全问题日益凸显,成为社会各界普遍关注的焦点。在这样的背景下,软考网络安全专业应运而生,为培养高素质的网络安全人才提供了有力支撑。本文将对软考网络安全专业进行深入剖析,探讨其在信…

什么是YApi?开源接口管理平台部署教程

YApi 到底是个啥? 各位小伙伴们好呀!今天要给大家介绍的是一款超级好用的接口管理神器——YApi!它是一个高效、易用、功能强大的 API 管理平台,简直就是开发、产品、测试人员的福音啊!!!它能帮…

PCIe信号传输的幕后:HCSL与LP-HCSL深度解析

在数字化浪潮席卷的当下,PCIe(Peripheral Component Interconnect Express)作为高速串行计算机扩展总线标准,已然成为计算机内部硬件设备连接领域的中流砥柱。其信号传输的质量与完整性,恰似计算机系统运行的 “命门”…

创建系统还原点,保护系统安全

在我们使用电脑时,经常会因为系统设置问题,中毒,驱动,注册表等等问题导致系统无法正常运行,甚至崩溃 其实,Windows内置了像手机一样的还原功能,只要平时创建了还原点,出现问题时就可…