Redis 缓存穿透、击穿、雪崩的 出现场景 与 解决方案

一、缓存穿透(Cache Penetration)
问题描述

请求 数据库中不存在的数据(如非法ID),导致请求绕过缓存直接击穿到数据库。
典型场景

  • 恶意攻击:频繁请求 id=-1 或随机不存在的用户ID。

  • 业务逻辑缺陷:未校验参数合法性(如非数字ID查询)。

解决方案
  • 空值缓存

    将查询结果为 null 的请求也缓存,设置较短的过期时间(如 5分钟)。
public Object getData(String key) {Object value = redis.get(key);if (value != null) {return value;  // 命中缓存}// 查数据库value = db.query(key);if (value == null) {redis.setex(key, 300, "NULL");  // 缓存空值} else {redis.setex(key, 3600, value);  // 缓存真实值}return value;
}

布隆过滤器(Bloom Filter)

  • 在缓存层前加布隆过滤器,判断请求的 key 是否可能存在:

    • 存在 → 查缓存或数据库。

    • 不存在 → 直接返回,避免查库。

接口层校验

  • 对请求参数进行合法性校验(如ID范围、格式)。
二、缓存击穿(Cache Breakdown)
问题描述

热点数据过期瞬间,大量并发请求直接涌入数据库。
典型场景

  • 明星爆款商品详情页缓存过期。

  • 秒杀活动中核心商品信息缓存失效。

解决方案
  1. 互斥锁(分布式锁)

    • 只允许一个线程重建缓存,其他线程等待。

public Object getData(String key) {Object value = redis.get(key);if (value == null) {String lockKey = key + "_LOCK";if (redis.setnx(lockKey, "1", 10)) {  // 获取锁try {value = db.query(key);        // 查数据库redis.setex(key, 3600, value); } finally {redis.del(lockKey);           // 释放锁}} else {Thread.sleep(100);                // 等待后重试return getData(key);              // 递归调用}}return value;
}

逻辑过期时间(永不过期 + 异步更新)

  • 缓存不设置物理过期时间,但存储逻辑过期字段。

  • 后台线程定期检测并更新缓存。

// 缓存数据结构
class CacheData {Object data;long expireTime;  // 逻辑过期时间
}public Object getData(String key) {CacheData cacheData = redis.get(key);if (cacheData == null) {return db.query(key);  // 首次加载}if (System.currentTimeMillis() > cacheData.expireTime) {// 提交异步任务更新缓存executor.submit(() -> {Object newData = db.query(key);redis.set(key, new CacheData(newData, System.currentTimeMillis() + 3600000));});}return cacheData.data;
}

热点数据永不过期

  • 对极热点数据不设置过期时间,通过异步线程定期更新。

三、缓存雪崩(Cache Avalanche)
问题描述

大量缓存同时过期 或 缓存服务宕机,导致请求全部涌入数据库。
典型场景

  • 缓存服务器重启后所有数据丢失。

  • 批量缓存设置相同过期时间(如每日零点统一过期)。

解决方案
  • 随机过期时间

        在基础过期时间上增加随机值(如 基础时间 + 随机0~300秒)。

int baseExpire = 3600;
int randomExpire = baseExpire + new Random().nextInt(300);
redis.setex(key, randomExpire, value);
  • 集群高可用

    • 使用 Redis 集群(Cluster)或哨兵模式(Sentinel)避免单点故障。

  • 熔断降级

    • 当数据库压力过大时,启用熔断机制(如返回默认值、限流)。

// 使用 Hystrix 实现熔断
@HystrixCommand(fallbackMethod = "fallbackGetData")
public Object getData(String key) {return redis.get(key);
}public Object fallbackGetData(String key) {return "系统繁忙,请稍后重试";  // 降级响应
}
  • 多级缓存

    • 本地缓存(如 Caffeine) + Redis 缓存,降低 Redis 压力。

对比总结

问题类型触发条件核心解决思路典型方案
穿透查询不存在的数据拦截非法请求、缓存空值布隆过滤器、空值缓存
击穿热点数据过期限制并发重建、异步更新互斥锁、逻辑过期时间
雪崩大量缓存同时失效或服务宕机分散过期时间、服务高可用随机过期、集群部署、熔断降级

实战建议

  1. 组合使用方案

    • 布隆过滤器 + 空值缓存 → 解决穿透。

    • 互斥锁 + 随机过期 → 解决击穿和雪崩。

  2. 监控与预警

    • 监控缓存命中率、数据库 QPS,及时发现问题。

  3. 压测验证

    • 模拟高并发场景,验证方案的可靠性。

通过合理设计缓存策略,可显著提升系统在高并发场景下的稳定性和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28718.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tomcat的安装与配置(包含在idea中配置tomcat)

Tomcat 是由 Apache 软件基金会开发的开源 Java Web 应用服务器,主要用于运行 Servlet 和 JSP(JavaServer Pages)程序。它属于轻量级应用服务器,适用于中小型系统及开发调试场景,尤其在处理动态内容(如 Jav…

快速开始React开发(一)

快速开始React开发(一) React是一个JavaScript库,用于构建交互式网站,并且能够快捷创建SPA(Single Page App),其组件化的思想也是被一再传播,无论是普通的Web网站还是嵌入移动端交互…

安装nvidia-docker 和设置docker 镜像源

Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 可以先参考官方文档 下面的操作具体和官方文档类似 curl -fsSL https://mirrors.ustc.edu.cn/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-ke…

C++第二节:C/C++内存管理

1.C/C内存分布 【说明】 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分…

rust编程实战:实现3d粒子渲染wasm

源码 纯js实现 fps: wasm实现 通过对比可以看出来 wasm 实现的计算比纯js刷新相对稳定。

开放鸿蒙OpenHarmony 5.0.0 Release 兼容性测试实战经验分享

OpenHarmony 5.0版本的发布时间是2024年12月20日至21日。这个版本带来了许多新特性和改进。现在5.0出了两个release 版本,分别是5.0.0和5.0.1。 就在5.0版本发布不到2周的时间内,2025年01月01日起,不支持新产品基于老分支(OpenHar…

deepseek在pycharm 中的配置和简单应用

对于最常用的调试python脚本开发环境pycharm,如何接入deepseek是我们窥探ai代码编写的第一步,熟悉起来总没坏处。 1、官网安装pycharm社区版(免费),如果需要安装专业版,需要另外找破解码。 2、安装Ollama…

23种设计模式一览【设计模式】

文章目录 前言一、创建型模式(Creational Patterns)二、结构型模式(Structural Patterns)三、行为型模式(Behavioral Patterns) 前言 设计模式是软件工程中用来解决特定问题的一组解决方案。它们是经过验证…

spring boot整合flyway实现数据的动态维护

1、简单介绍一下flyway Flyway 是一款开源的数据库版本控制工具,主要用于管理数据库结构的变更(如创建表、修改字段、插入数据等)。它通过跟踪和执行版本化的迁移脚本,帮助团队实现数据库变更的自动化。接下来简单介绍一下flyway…

致远电子三合一8路串口服务器

ZLG致远电子全新推出国产化透传型三合一8路串口服务器,让用户轻松实现串口信号与以太网的无缝数据交互。性能强悍,等你来评,还有机会获得新年第一份心意! GCOM88-2NET-P硬件速览 国产高性能816MHz处理器; 2路10/100M自…

20250304解决在飞凌的OK3588-C的Linux R4下解决使用gstreamer保存的mp4打不开

sync poweroff rootok3588:/# sync rootok3588:/# sync rootok3588:/# cd 107 rootok3588:/107# ls -l total 0 rootok3588:/107# sync rootok3588:/107# poweroff 20250304解决在飞凌的OK3588-C的Linux R4下解决使用gstreamer保存的mp4打不开 2025/3/4 10:58 缘起&#xff1a…

安路FPGA移植Cortex-M0内核

本文是关于基于安路FPGA EG4S20BG256移植Cortex M0内核的笔记。硬件平台使用硬木课堂的安路核心板,软件使用安路的TD5.6.2和keil5。(博主刚学FPGA不久,文中有不足之处请帮忙指出) 在移植之前,博主看了网上很多的文章、…

STM32——串口通信 UART

一、基础配置 Universal Asynchronous Receiver Transmitter 异步,串行,全双工 TTL电平 :高电平1 低电平0 帧格式: 起始位1bit 数据位8bit 校验位1bit 终止位1bit NVIC Settings一栏使能接受中断。 之前有设置LCD,…

flink集成tidb cdc

Flink TiDB CDC 详解 1. TiDB CDC 简介 1.1 TiDB CDC 的核心概念 TiDB CDC 是 TiDB 提供的变更数据捕获工具,能够实时捕获 TiDB 集群中的数据变更(如 INSERT、UPDATE、DELETE 操作),并将这些变更以事件流的形式输出。TiDB CDC 的…

DeepSeek×博云AIOS:突破算力桎梏,开启AI普惠新纪元

背景 在全球人工智能技术高速迭代的背景下,算力成本高企、异构资源适配复杂、模型部署效率低下等问题,始终是制约企业AI规模化应用的关键。 DeepSeek以创新技术直击产业痛点,而博云先进算力管理平台AIOS的全面适配,则为这一技术…

ArcGIS Pro建库中常用公式的应用与技巧

在当今数字化的时代,地理信息系统(GIS)在各个领域都发挥着至关重要的作用。 ArcGIS Pro作为一款功能强大的GIS软件,为用户提供了丰富的工具和功能,使得数据处理、地图制作和空间分析变得更加高效和便捷。 本文将为您…

C++入门基础

文章目录 C核心特性详解(基础增强版)一、第一个C程序:Hello World完整代码解析新手常见问题 二、命名空间(详解版)1. 为什么需要命名空间?2. 命名空间使用场景3. 嵌套命名空间4. 匿名命名空间 三、输入输出…

探秘基带算法:从原理到5G时代的通信变革【三】Turbo 编解码

文章目录 2.2 Turbo 编解码2.2.1 基本概念与系统构成2.2.2 编码过程分步解析交织器递归系统卷积编码器复接器总结 2.2.3 译码算法分类与原理Turbo码的强大主要来源于其解码器理论基础解码过程详解交织与解交织译码算法总结 2.2.4 Turbo码的应用场景无线通信卫星通信深空通信 2.…

一键无损放大视频,让老旧画面重焕新生!

打工人们你们好!这里是摸鱼 特供版~ 嘿,朋友们!在数字时代,视频已经成为我们生活中不可或缺的一部分。无论是珍贵的家庭录像,还是老旧的影视素材,我们都希望能以高清画质重温那些美好瞬间。但很多时候&…

build gcc

1,下载源码 wget https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-4.1.0.tar.bz2 wget https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 wget https://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.2.1.tar.gz git clone --mirror https://github…