redis缓存三大问题分析与解决方案

什么是缓存?

缓存(Cache)是一种将热点数据缓存在内存中(如 Redis)以加快访问速度、减轻数据库压力的技术。

但引入缓存后可能出现 三大核心问题

  • 缓存穿透(Cache Penetration)
  • 缓存击穿(Cache Breakdown)
  • 缓存雪崩(Cache Avalanche)

一、缓存穿透(Cache Penetration)

问题描述

缓存穿透指:请求的数据既不在缓存中,也不在数据库中,导致请求每次都打到数据库

常见场景

  • 恶意攻击:传入大量随机 ID,绕过缓存层直击数据库
  • 用户访问非法 ID,如 /user?id=-1

举例

用户频繁访问一个 不存在的商品 ID:99999999

  • Redis 无此数据 → 查询数据库
  • 数据库无 → 返回 null
  • 下次再次请求 ID=99999999,又重复上述过程 → DB 被压垮

解决方案

1. 缓存空值
if (dbData == null) {redis.set("shop:99999999", "", 2分钟);
}
  • 空值也缓存,避免重复查数据库
  • 设较短 TTL(避免缓存过期数据太久)
2. 参数校验拦截非法请求
  • 如:ID 不能为负数或超过最大值
  • 在请求层面做过滤,不进 DB 或 Redis
3. 布隆过滤器(适用于大数据量)
  • 将所有合法 ID 加入布隆过滤器
  • 请求前先判断是否命中布隆过滤器,不在则直接拒绝

二、缓存击穿(Cache Breakdown)

问题描述

缓存击穿指:某个热点 Key 刚好失效时,大量并发请求打到数据库,导致数据库瞬时压力激增。

常见场景

  • 热点数据正好在高峰期过期
  • 比如:商品详情页、秒杀商品、抢购库存

举例

商品 ID=1 每天百万访问量,缓存过期瞬间,大量用户同时访问导致:

  • Redis 查不到 → 并发查询 DB → 数据库压力飙升

解决方案

1. 互斥锁方式:单线程缓存重建
if (redis.get("shop:1") == null) {if (tryLock("lock:shop:1")) {// 从 DB 读取 → 缓存写回 Redisunlock();} else {// 其他线程等待或返回默认值}
}
  • 缓存重建交给首个拿到锁的线程,其它线程等待或快速失败
2. 逻辑过期 + 异步重建(推荐)
{"data": {...},"expireTime": "2025-06-30 12:00:00"
}
  • 缓存提前设置一个逻辑过期时间(保存在 value 中)
  • 判断已过期 → 异步线程后台刷新 → 返回旧数据不中断用户体验

适合热点数据缓存更新


三、缓存雪崩(Cache Avalanche)

问题描述

大量缓存同时过期,导致所有请求同时访问数据库,引发系统雪崩。

常见场景

  • 设置了相同 TTL 的大量缓存同时过期
  • Redis 重启或崩溃,缓存瞬间全部丢失

举例

  • 秒杀系统中 10 万商品都设置 TTL=24小时
  • 恰好第二天凌晨失效 → 所有请求打到数据库

解决方案

1. 缓存过期时间加随机
int ttl = 3600 + RandomUtil.randomInt(0, 600);
redis.set("shop:" + id, value, ttl, TimeUnit.SECONDS);
  • 避免所有 key 同一时间过期,均匀错开时间点
2. 热点数据永不过期 + 后台异步刷新
  • 逻辑过期方案 + 后台定时更新
  • 热点数据维持高可用
3. 多级缓存(本地 + 分布式)
  • 如:Caffeine + Redis + MySQL 三层缓存
  • Redis 崩溃时,先从本地缓存兜底
4. 限流+降级
  • 接口层加限流、熔断、降级返回默认值,避免雪崩扩大化

项目中 Redis 缓存策略总结

问题定义解决方案
缓存穿透请求数据既不在缓存也不在数据库缓存空值、参数校验、布隆过滤器
缓存击穿热点 key 在高并发下刚好失效加锁互斥、逻辑过期 + 异步刷新
缓存雪崩大量 key 同时过期、或 Redis 故障加 TTL 随机值、热点永不过期、多级缓存、限流降级

实战建议

  • 所有缓存数据 务必设置 TTL,默认不要永久存在
  • 区分冷数据(短 TTL)与热点数据(长 TTL 或逻辑过期)
  • 高并发业务使用异步线程池或消息队列缓冲请求
  • 建立统一的缓存封装组件(CacheClient),集中处理这些问题

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

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

相关文章

李宏毅机器学习笔记——梯度下降法

深度学习介绍 基于仿生学的一种自成体系的机器学习算法,包括但不限于图像识别、语音、文本领域。 梯度下降法 作为深度学习算法种常用的优化算法 梯度下降法,是一种基于搜索的最优化方法,最用是最小化一个损失函数。梯度下降是迭代法的一…

day50/60

浙大疏锦行 DAY 50 预训练模型CBAM模块 知识点回顾: resnet结构解析CBAM放置位置的思考针对预训练模型的训练策略 差异化学习率三阶段微调 ps:今日的代码训练时长较长,3080ti大概需要40min的训练时长 作业: 好好理解下resnet18的…

Vue3 之vite.config.js配置

一、示例 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path // https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],base: ./,build: {assetsDir: static, //指定静态资源目录rollupOptions: {input: {mai…

利用Gpu训练

方法一: 分别对网络模型,数据(输入,标注),损失函数调用.cuda() 网络模型: if torch.cuda.is_available():netnet.cuda() 数据(训练和测试): if torch.cud…

使用excel中的MATCH函数进行匹配数据

一、背景 在平日处理数据时,经常需要将给定数据按照制定的数据进行排序,数量比较大时,逐个处理有点费事费力且容易出错,这时可借助excel表格中match函数进行精确匹配。 二、使用match函数–精确排序操作步骤 主要工作步骤&#xf…

SpringCloud系列(41)--SpringCloud Config分布式配置中心简介

前言:微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,但由于每个服务都需要必要的配置信息才能运行,所以—套集中式的、动态的配置管理设施是必不可少的&…

wireshark介绍和使用

Wireshark 介绍 Wireshark 是一款开源的 网络协议分析工具(Packet Sniffer),用于捕获和分析网络数据包。它支持多种协议解析,适用于网络调试、安全分析、网络教学等场景。 官网:https://www.wireshark.org/ 特点&#…

【甲方安全建设】敏感数据检测工具 Earlybird 安装使用详细教程

文章目录 背景工具介绍安装方法一、Linux 与 macOS 安装流程二、Windows 系统安装流程(一)三、Windows 系统安装流程(二)四、错误处理使用说明模块与规则机制集成与运维建议结语背景 随着源代码泄露、配置误提交、密码硬编码等风险频发,企业源代码库中潜在的敏感信息泄漏…

异步Websocket构建聊天室

目录 Websocket技术背景 Websockec简介 实现websocket通信程序 实验环境: 服务端(阿里云ESC,VPC网络): 客户端1(本机): 通信模型: 实现功能逻辑: 源代码: 服务…

OpenCV CUDA模块设备层-----反向二值化阈值处理函数thresh_binary_inv_func()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 OpenCV CUDA 模块(cudev) 中的一个仿函数(functor)生成器,用于创建一个反向二值化阈值…

【实现一个时间MCP完整技术解析】

🕒 MCP Time Server 完整技术解析:从核心实现到文件架构的深度剖析 目前已上传npm库,chan-mcp-time-server,有兴趣的可以下载试试 创建时间: 2025年7月2日 🎯 项目概述与架构设计 核心问题定义 AI助手在处理时间相关…

类成员方法命名风格解析:动宾、纯动词与纯名词的选择之道

在软件开发的浩瀚代码海洋中,类成员方法的命名犹如指引开发者的灯塔,其重要性不言而喻。合理的命名不仅能让代码 “自我言说”,降低理解成本,还能提升开发效率,促进团队协作。常见的类成员方法命名风格可归纳为动宾结构…

自己电脑搭建本地服务器并实现公网访问,内网也能提供互联网连接使用

如何在本地自己计算机上自建服务器并开启公网地址提供互联网服务的详细教学,一步步操作流程,从本地部署到配置公网IP,最后并附无公网IP内网穿透公网访问的nat123方案。 要在自用的电脑上搭建本地服务器并实现公网地址的访问,需要…

如何使用AI改进论文写作 ---- 引言篇(2)

写在前面 本篇作为1.0版本的补充优化,记录本人的研究过程。 在分析了多本论文写作的相关的书籍之后,我明白了一点,关于论文写作,永远是一个熟能生巧的过程,对于人来说,必须多写才能够变得熟练,对…

【Java21】在spring boot中使用ScopedValue

文章目录 0.环境说明1.基础知识1.1 ScopedValue的特点 2.应用场景2.1 spring web项目中,使用ScopedValue传递上下文(全局不可变量)2.2 spring grpc项目中,使用ScopedValue传递上下文(全局不可变量) 3.Scope…

第10篇 图像语义分割和目标检测介绍

语义分割(Semantic Segmentation)是图像处理和机器视觉一个重要分支,其目标是精确理解图像场景与内容。语义分割是在像素级别上的分类,属于同一类的像素都要被归为一类,因此语义分割是从像素级别来理解图像的。如下如所示的照片,属…

微算法科技(NASDAQ MLGO)基于量子图像处理的边缘检测算法:开拓图像分析新视野

在当今数字化时代,图像数据海量增长,边缘检测作为图像处理的关键环节,在机器视觉、医学成像、安防监控等众多领域有着至关重要的作用。传统边缘检测算法在处理复杂图像时,面临计算效率低、精度不足等问题。量子计算的兴起&#xf…

SM4密码算法的C语言实现(带测试)

一、SM4算法原理 SM4是中国国家密码管理局于2012年发布的国家商用密码算法标准,也称为GB/T 32907-2016。它是一种分组对称加密算法,采用32轮非线性迭代结构,分组长度和密钥长度均为128位。SM4算法的设计充分考虑了安全性、高效性和实现简便性…

【React Native原生项目不能运行npx react-native run-android项目】

运行命令报错,帮我修复X:\jetbrains-workspace\theme-wallpaper>npx react-native run-android error Android project not found. Are you sure this is a React Native project? If your Android files are located in a non-standard location (e.g. not inside ‘andro…

SPLADE 在稀疏向量搜索中的原理与应用详解

今天看到Sentence Transformers v5.0 集成了许多稀疏嵌入模型。为了搞清楚什么稀疏嵌入模型以及应用,查到了SPLADE,比较巧合的是在paper reading分享的时候看到有同学分享了一片ACL 2025的工作也是基于SPLADE去做的。下面结合一些资料分享关于SPLADE 在稀…