news 2026/9/3 9:18:50

说说什么是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/9/2 23:26:13

CAM++后台运行中断?持久化部署解决方案来了

CAM后台运行中断?持久化部署解决方案来了 1. 问题背景:为什么你的CAM系统总是断开? 你是不是也遇到过这种情况:好不容易把CAM说话人识别系统跑起来,浏览器一关、SSH连接一断,服务就直接挂了?或…

作者头像 李华
网站建设 2026/9/2 23:23:31

还在为文件数据丢失烦恼?深入解析C语言二进制IO机制

第一章:还在为文件数据丢失烦恼?深入解析C语言二进制IO机制 在现代软件开发中,数据持久化是系统稳定运行的关键环节。当程序异常退出或硬件故障发生时,文本格式的文件容易因编码不一致或结构破坏而丢失关键信息。相比之下&#xf…

作者头像 李华
网站建设 2026/9/2 23:25:16

Unsloth异常检测模型:日志分析场景实战

Unsloth异常检测模型:日志分析场景实战 1. Unsloth 简介 你有没有遇到过这样的问题:系统日志成千上万条,想找一个异常行为就像大海捞针?传统方法靠规则匹配,维护成本高、漏报多。而如今,用大模型来做异常…

作者头像 李华
网站建设 2026/9/3 4:51:46

学而思编程周赛语言基础组 | 2025年秋第12周

​欢迎大家订阅我的专栏:算法题解:C与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选…

作者头像 李华
网站建设 2026/9/3 1:31:29

Live Avatar技术解析:序列并行ulysses_size原理

Live Avatar技术解析:序列并行ulysses_size原理 1. Live Avatar阿里联合高校开源的数字人模型 最近,阿里巴巴联合多所高校推出了一个名为Live Avatar的开源项目,这是一个基于14B参数规模的语音驱动数字人生成模型。该模型能够根据输入的音频…

作者头像 李华