news 2026/7/2 3:00:26

说说什么是Redis缓存击穿、缓存穿透、缓存雪崩?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
说说什么是Redis缓存击穿、缓存穿透、缓存雪崩?

大家好,我是锋哥。最近不少粉丝问锋哥什么是Redis缓存击穿、缓存穿透、缓存雪崩?今天锋哥来总结下,大家可以参考。

2026年,锋哥又开始收Java学员了!

Redis作为高性能的键值存储解决方案,广泛应用于缓存机制中。然而,在其实际使用中,开发者们常常会遇到“缓存击穿”、“缓存穿透”和“缓存雪崩”这几个概念。为了解释这些问题,并提供相应的解决方案,本文将结合Java代码进行说明。

一、缓存击穿

定义

缓存击穿是指在高并发情况下,某个热点数据的缓存失效,导致大量请求同时访问数据库,从而对数据库造成巨大的压力。

场景

假设某个用户的数据在缓存中失效,且每个请求同时访问数据库,数据库可能因此崩溃。

解决方案

使用互斥锁(例如,用Redis的SETNX命令),确保只有一个请求去查询数据库。

Java代码示例
import redis.clients.jedis.Jedis;public class CacheTest {private Jedis jedis = new Jedis("localhost");public String getData(String key) {String data = jedis.get(key);if (data == null) {// 使用分布式锁String lockKey = "lock:" + key;String lockValue = String.valueOf(System.currentTimeMillis() + 10000); // 10秒锁if (jedis.setnx(lockKey, lockValue) == 1) {try {// 此处模拟数据库查询data = queryDatabase(key);jedis.set(key, data);} finally {jedis.del(lockKey); // 释放锁}} else {// 等待一段时间后重试Thread.sleep(100);return getData(key);}}return data;}private String queryDatabase(String key) {// 模拟数据库查询return "data_for_" + key; // 返回数据库中的数据}}

二、缓存穿透

定义

缓存穿透指的是请求的数据在缓存和数据库中均不存在,导致每次请求都直达数据库,造成数据库的负担。

场景

攻击者可能发送大量请求,访问不存在的ID,导致数据库处理大量无效请求。

解决方案

引入布隆过滤器,提前过滤不存在的请求,或者对不存在的数据进行空对象缓存。

Java代码示例
import redis.clients.jedis.Jedis;public class CacheTest {private Jedis jedis = new Jedis("localhost");public String getData(String key) {// 布隆过滤器模拟if (!isKeyValid(key)) {return null; // 过滤掉无效请求}String data = jedis.get(key);if (data == null) {// 查询数据库data = queryDatabase(key);if (data == null) {// 将空对象缓存jedis.set("empty:" + key, ""); // 设置空对象缓存} else {jedis.set(key, data);}}return data;}private boolean isKeyValid(String key) {// 模拟布隆过滤器的有效性判断return key.matches("^[a-zA-Z0-9]+$"); // 仅允许字母和数字}private String queryDatabase(String key) {// 模拟数据库查询return "data_for_" + key; // 返回数据库中的数据}}

三、缓存雪崩

定义

缓存雪崩是指在某个时间点,大量缓存数据同时失效,导致缓存不可用,所有请求直达数据库。

场景

例如,若多个缓存的过期时间设定为相同,到了同一时刻,所有缓存都失效,直接向数据库发送请求。

解决方案

设置不同的过期时间,避免同时失效。

Java代码示例
import redis.clients.jedis.Jedis;public class CacheTest {private Jedis jedis = new Jedis("localhost");public String getData(String key) {String data = jedis.get(key);if (data == null) {// 查询数据库data = queryDatabase(key);if (data != null) {// 设置不同过期时间,使用随机时间int randomExpireTime = 60 + (int)(Math.random() * 60); // 随机60秒到120秒jedis.setex(key, randomExpireTime, data); // 设置过期时间}}return data;}private String queryDatabase(String key) {// 模拟数据库查询return "data_for_" + key; // 返回数据库中的数据}}

最后总结下,Redis在缓存中能够有效提升系统性能,但在实际应用中,缓存击穿、缓存穿透和缓存雪崩是不可忽视的问题。通过上述的示例和解决方案,开发者可以基于Java和Redis构建更加稳定和高效的缓存机制,提高系统的可靠性和响应速度。希望本篇文章能为大家提供帮助和启发。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/28 23:41:58

Qwen3-1.7B高并发部署案例:多用户访问性能优化策略

Qwen3-1.7B高并发部署案例:多用户访问性能优化策略 Qwen3-1.7B 是通义千问系列中的一款轻量级大语言模型,具备出色的推理能力与响应速度。它在保持较小参数规模的同时,依然能够支持复杂任务的生成与理解,非常适合用于需要快速部署…

作者头像 李华
网站建设 2026/7/1 20:23:19

学习干货_从迷茫到前行:我的网络安全学习之路

网络安全成长之路:从零基础到实战专家的学习指南(建议收藏) 本文作者"州弟"分享了自己从网络安全小白成长为专业人员的经历。他强调破除"学生思维",通过实践而非死记硬背学习;推荐扎实掌握Linux、…

作者头像 李华
网站建设 2026/6/26 12:19:14

fft npainting lama混合精度训练配置:AMP加速收敛技巧

fft npainting lama混合精度训练配置:AMP加速收敛技巧 1. 引言:图像修复的工程实践与性能优化需求 在图像修复任务中,fft npainting lama 已成为当前主流的开源方案之一。它基于深度卷积网络和傅里叶空间特征建模,在物体移除、水…

作者头像 李华
网站建设 2026/6/26 1:57:17

【Boost.Asio网络编程效率提升10倍】:异步I/O模型底层原理全解析

第一章:Boost.Asio网络编程的核心优势与应用场景 Boost.Asio 是一个基于 C 的跨平台库,专为异步 I/O 操作设计,广泛应用于高性能网络服务开发。其核心优势在于统一的异步模型、对底层操作系统的高效封装,以及对现代 C 特性的深度支…

作者头像 李华
网站建设 2026/6/29 0:25:04

C++ vector何时扩容?扩容因子是多少?真相全在这里(附实测数据)

第一章:C STL vector 扩容机制详解 C 标准模板库(STL)中的 std::vector 是最常用且高效的动态数组容器之一。其核心优势在于能够自动管理内存,支持动态扩容,从而在运行时灵活地添加或删除元素。 扩容触发条件 当向 ve…

作者头像 李华
网站建设 2026/6/26 1:49:53

【C++项目构建避坑指南】:为什么总出现undefined reference?真相曝光

第一章:undefined reference错误的本质解析 undefined reference 是C/C开发中常见的链接阶段错误,它表示编译器成功完成了源码的语法分析与目标文件生成,但在链接过程中无法找到某些符号(函数、变量等)的实际定义。该错…

作者头像 李华