当前位置: 首页 > news >正文

【面试题】Redis缓存问题全解:击穿、雪崩与穿透

文章目录

      • Redis缓存问题全解:击穿、雪崩与穿透
        • 引言
        • 1. 缓存击穿(Cache Penetration)
        • 2. 缓存雪崩(Cache Avalanche)
        • 3. 缓存穿透(Cache Penetration)
      • 总结
      • 1. 缓存击穿(Cache Penetration)
      • 2. 缓存雪崩(Cache Avalanche)
      • 3. 缓存穿透(Cache Penetration)
        • 结语
        • 学习资源
        • 互动环节

Redis缓存问题全解:击穿、雪崩与穿透

引言

在本篇文章中,我们将深入探讨在使用Redis作为缓存层时可能遇到的三种主要问题:缓存击穿、缓存雪崩和缓存穿透。我们将分析每种问题的成因,并提供具体的解决方案。

1. 缓存击穿(Cache Penetration)

定义:当热点数据在Redis中过期后,大量请求直接查询数据库,而非缓存。

成因

  • 热点数据过期。
  • 高并发请求。

解决方案

  • 互斥锁:使用SETNX命令设置键,确保只有一个请求访问数据库。
  • 缓存空对象:将空结果也缓存,设置较短的过期时间。

示例代码

# 使用SETNX设置互斥锁
redis-cli setnx lock_key "value" EX 10# 缓存空对象
redis-cli set cache_key "null_value" EX 60
2. 缓存雪崩(Cache Avalanche)

定义:大量缓存数据在同一时间过期,导致大量请求同时查询数据库。

成因

  • 缓存数据集中过期。
  • 过期时间设置不当。

解决方案

  • 分散过期时间:为缓存数据设置随机过期时间。
  • 限流:对请求进行限流,避免数据库压力过大。
  • 持久化:开启Redis持久化,确保数据快速恢复。

示例代码

# 分散过期时间
redis-cli pexpire key (ttl + random_value)# 使用Guava RateLimiter进行限流
double permitsPerSecond = 10.0;
RateLimiter rateLimiter = RateLimiter.create(permitsPerSecond);
3. 缓存穿透(Cache Penetration)

定义:查询不存在的数据,请求直接落到数据库。

成因

  • 查询数据库中不存在的数据。

解决方案

  • 布隆过滤器:使用布隆过滤器拦截不存在的数据请求。
  • 缓存空对象:将不存在的数据缓存,设置较短的过期时间。
  • 校验机制:在应用层增加校验,确保查询的是合法数据。

示例代码

// 初始化布隆过滤器
BloomFilter<String> filter = BloomFilter.create(Funnels.stringFunnel(), 10000);// 校验查询参数
boolean isValid = validateQuery(query);
if (isValid && !filter.mightContain(query)) {// 执行查询并缓存结果
}

总结

1. 缓存击穿(Cache Penetration)

定义:当某个热点数据失效时,大量的请求直接访问数据库,导致数据库压力过大。

解决方案:

互斥锁:在查询数据前,使用Redis的SETNX命令设置一个互斥锁,确保同时只有一个请求去查询数据库。
缓存空对象:如果查询数据库没有结果,也将其缓存起来,但设置一个较短的过期时间。
预加载:对于热点数据,在数据加载到数据库时就同时加载到缓存中。

2. 缓存雪崩(Cache Avalanche)

定义:大量缓存数据在相同的时间过期,导致在某一时刻大量请求同时查询数据库,造成数据库压力过大。

解决方案:

分散过期时间:为缓存数据设置随机的过期时间,避免同时过期。 限流:在系统层面进行限流,避免同时处理大量请求。
使用持久化:开启Redis的持久化机制,即使缓存服务宕机,重启后也能快速恢复数据。

3. 缓存穿透(Cache Penetration)

定义:查询不存在的数据,导致请求直接打到数据库,如果这类查询很多,也会导致数据库压力过大。

解决方案:

布隆过滤器:使用布隆过滤器拦截不存在的数据请求,避免对数据库的查询。
缓存空对象:与缓存击穿类似,将不存在的数据也缓存起来,但设置较短的过期时间。 校验机制:在应用层增加校验机制,确保查询的是合法的数据。
通用策略 监控和报警:对缓存命中率、异常请求等进行监控,并设置报警机制,及时发现问题。
负载均衡:使用多个Redis实例进行负载均衡,避免单点故障。 高可用架构:使用Redis集群,提高系统的可用性和容错能力

结语

通过上述分析和解决方案,我们可以更有效地处理Redis缓存层可能遇到的问题,确保应用程序的稳定性和性能。

学习资源
  • Redis官方文档
  • 布隆过滤器实现
互动环节
  • 请分享您在使用Redis缓存时遇到的问题及解决方案。

相关文章:

【面试题】Redis缓存问题全解:击穿、雪崩与穿透

文章目录 Redis缓存问题全解&#xff1a;击穿、雪崩与穿透引言1. 缓存击穿&#xff08;Cache Penetration&#xff09;2. 缓存雪崩&#xff08;Cache Avalanche&#xff09;3. 缓存穿透&#xff08;Cache Penetration&#xff09; 总结1. 缓存击穿&#xff08;Cache Penetratio…...

676. 实现一个魔法字典

676. 实现一个魔法字典 题目链接&#xff1a;676. 实现一个魔法字典 代码如下&#xff1a; class MagicDictionary { public:MagicDictionary() {}void buildDict(vector<string> dictionary) {wordsdictionary;}bool search(string searchWord) {for(const auto&…...

Spring Boot 入门以及对微服务的理解

目录 1.Spring Boot 简介 1.1什么是自动装配 1.2什么是内嵌Tomcat 2.微服务 2.1单体应用系统 2.2分布式应用系统 2.3微服务 2.3.1什么是微服务 微服务有哪些优点 微服务有哪些缺点 2.3.2为什么选择微服务 1.Spring Boot 简介 Spring Boot 是简化 Spring 应用开发的…...

仿RabbiteMq实现简易消息队列正式篇(需求分析)

TOC 目录 MQ的实现方法 RabbitMq中的相关概念 消息队列系统模块划分 总体划分 服务端模块 数据管理模块 虚拟机数据管理模块 交换机路由模块 消费者管理模块 信道&#xff08;通信&#xff09;管理模块 连接管理模块 服务端BrokerServer模块 客户端模块 消费者管…...

Python酷库之旅-第三方库Pandas(082)

目录 一、用法精讲 341、pandas.Series.str.startswith方法 341-1、语法 341-2、参数 341-3、功能 341-4、返回值 341-5、说明 341-6、用法 341-6-1、数据准备 341-6-2、代码示例 341-6-3、结果输出 342、pandas.Series.str.strip方法 342-1、语法 342-2、参数 …...

0101中文乱码-BufferedImage-图片处理

文章目录 1、问题描述2 、电子证书生成3、中文乱码原因及修复4、思考 结语 1、问题描述 接手维护一个休闲赛事类项目&#xff0c;因为服务器到期&#xff0c;项目从云服务器迁移到本地服务器。 项目生成比赛&#xff0c;分为二人组、三人组等等的团体&#xff1b;比赛设置几个…...

[Qt][Qt 事件][下]详细讲解

目录 1.定时器0.是什么&#xff1f;1.QTimerEvent2.QTimer3.获取系统⽇期及时间 2.事件分发器1.概述2.事件分发器工作原理3.使用 3.事件过滤器0.是什么&#xff1f;2.使用 1.定时器 0.是什么&#xff1f; 在进⾏窗⼝程序的处理过程中&#xff0c;经常要周期性的执⾏某些操作&…...

八股总结----计算机网络

0.OSI七层模型 自己的理解&#xff1a;应用层&#xff1a;生成HTTP请求报文-----表示层&#xff1a;将请求报文转换成适合网络传输的数据格式&#xff0c;加密压缩编码等-----会话层&#xff1a;管理两个应用程序之间的会话&#xff0c;包括连接中断等------传输层&#xff1a…...

Laravel 框架开发 ERP 系统,技术选型和分析以及实施计划

目录 技术选型 技术分析 实施计划 实施步骤 可能需要引入的组件包 技术难点及解决方案 基于 Laravel 框架开发 ERP 系统&#xff0c;技术选型和分析以及实施计划需要考虑多个方面&#xff1a; 技术选型 后端框架&#xff1a;Laravel&#xff0c;因为它提供了丰富的功能…...

【Vue3】嵌套路由

【Vue3】嵌套路由 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内…...

pygame小游戏

代码存在一些bug&#xff0c;感兴趣可自行修改&#xff0c;游戏运行后玩法与吃金币游戏类似。&#xff08;代码及结果比较粗糙&#xff0c;仅供参考&#xff09; 注&#xff1a;&#xff08;图片、音乐、音效文件老是上传上传不上&#xff0c;想要可私&#xff0c;也可以自己找…...

.Net Core IIS 程序报错 Access to the path c:\\windows\\TEMP\\poifiles is denied

程序运行报错&#xff1a;Access to the path c:\\windows\\TEMP\\poifiles is denied &#xff0c;此错误本文介绍两种解决办法&#xff0c;选择适合你的方法即可&#xff1b;一般.Net程序运行方案二可能比较常用。 解决方案一&#xff1a; 从 IIS 访问文件系统 如果您在浏…...

交换机VLAN配置中Tagged与Untagged端口的差异和应用区别

VLAN&#xff08;虚拟局域网&#xff09;是一种将局域网设备从逻辑上划分为不同虚拟工作组的技术。它打破了传统局域网在物理位置上的限制&#xff0c;允许网络管理员根据功能、部门或安全需求等因素&#xff0c;将同一物理网络中的设备划分到不同的逻辑网络中。每个VLAN都像一…...

@OneToOne注解的作用

OneToOne 注解在 Java Persistence API (JPA) 中用于定义实体之间的一对一关系。这种关系意味着两个实体之间通过一个唯一键相互关联&#xff0c;即一个实体中的一个字段&#xff08;通常是主键或唯一字段&#xff09;对应于另一个实体中的一个字段&#xff08;也可以是主键或唯…...

vue动画、过渡效果

vue动画、过渡效果 一.动画二.过渡三.多个元素过渡四.第三方库的使用五.总结 一.动画 1.默认.v-enter-active/.v-leave-active, 如果有name则.name-enter-active/.name-leave-active 2.appear意思是一打开页面就 实现动画&#xff0c;是appear"true"的简写 二.过渡 三…...

在 Vue 3 项目中使用 Element UI Plus <el-calendar>组件与时区处理

文章目录 前言简介<el-calendar> 组件组件定制基础自定义内容示例优化点 时区处理时区问题简介获取时区偏移量 下期扩展&#xff1a;自己实现一个<el-calendar> 的思路结语 前言 简介 在 Vue 3 项目开发过程中&#xff0c;我们经常需要对 UI 组件进行定制以满足特…...

【系统架构设计】计算机网络

【系统架构设计】计算机网络 网络架构与协议网络互联模型OSI/RM 结构模型TCP/IP结构模型IPv6 局域网与广域网局域网特点 网络互连与常用设备网络互联设备交换技术路由技术 网络存储技术 网络架构与协议 网络互联模型 OSI/RM 结构模型 1977年&#xff0c;国际标准化组织为适应…...

《中国数据库前世今生》——历史的深度与未来的展望

在探索科技与历史的交织中&#xff0c;我有幸观看了《中国数据库前世今生》这部纪录片。影片开头它不仅是一段技术演进的回顾&#xff0c;更是中国IT领域从跟随到引领的壮丽史诗。后续深刻研读了专家们的深刻讨论&#xff0c;通过这部纪录片&#xff0c;我深刻感受到了数据库技…...

web前端之实现霓虹灯背景魔术卡、旋转的背景动画、模糊效果、边框、变量、filter

MENU 前言效果图htmlstyle 前言 代码段定义一个名为Magic Card的卡片&#xff0c;并通过一系列CSS属性和动画效果来美化和增强该卡片的视觉效果。 效果图 html <div class"card">Magic Card </div>style 代码 property --rotate {syntax: "<a…...

几款免费的时序数据库对比

InfluxDB、TDengine、OpenTSDB、QuestDB都是当前主流的时序数据库&#xff0c;它们在性能、功能、适用场景等方面各有特点。下面将从多个维度对这四个数据库进行对比分析&#xff1a; 一、性能 InfluxDB&#xff1a; 高效的时间序列数据写入性能&#xff0c;自定义TSM引擎&am…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...