Redis如何解决热Key问题
目录
- **如何解决 Redis 的热 Key(Hot Key)问题?**
- **解决方案**
- **1. 使用多级缓存**
- **方案**
- **2. 进行 Key 预分片(Key Sharding)**
- **方案**
- **3. 使用 Redis 复制机制(主从复制或集群)**
- **方案**
- **4. 采用批量 Key 轮换(Consistent Hash)**
- **方案**
- **5. 采用异步更新策略**
- **方案**
- **6. 限流和降级**
- **方案**
- **7. 结合 MQ 做异步削峰**
- **方案**
- **总结**
- **面试标准回答**
如何解决 Redis 的热 Key(Hot Key)问题?
热 Key(Hot Key)是指访问频率极高的键,在高并发场景下可能会造成:
- 单个 Redis 节点压力过大(大量请求命中一个 Key)。
- CPU 过载,响应变慢(甚至影响整个 Redis 集群)。
- 缓存失效后大量请求直接打到数据库,导致数据库崩溃(缓存击穿)。
解决方案
针对不同场景,解决方案主要包括 “分散请求” 和 “降低 Redis 负载” 两个方向。
1. 使用多级缓存
核心思路:在 Redis 之前增加一级缓存,减少 Redis 访问压力。
方案
-
本地缓存(L1 Cache)
- 在应用服务器上存储热点数据(如 Guava Cache, Caffeine)。
- 优点:访问速度更快,避免 Redis 过载。
- 缺点:如果多个应用服务器同时缓存相同 Key,可能会有数据一致性问题。
-
CDN 缓存(L0 Cache)
- 适用于静态资源或热点数据(如商品详情页)。
- 优点:减少数据库、Redis 访问压力。
示例:使用 Guava 本地缓存
LoadingCache<String, String> localCache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES).build(new CacheLoader<String, String>() {public String load(String key) throws Exception {return redis.get(key); // 从 Redis 取数据}});// 读取缓存
String value = localCache.get("hot_key");
2. 进行 Key 预分片(Key Sharding)
核心思路:将单个热 Key 拆分成多个 Key,让不同的 Redis 节点存储不同的副本,从而分散压力。
方案
- 存储时:写入多个不同的 Key,例如
hot_key_1, hot_key_2, hot_key_3。 - 查询时:随机访问
hot_key_n,或使用一致性 Hash 计算 Key。
示例
// 写入时分片
for (int i = 0; i < 3; i++) {redis.set("hot_key_" + i, value);
}// 读取时随机选一个
String key = "hot_key_" + (rand() % 3);
String value = redis.get(key);
适用场景
- 高并发计数(如热点直播间点赞)。
- 高 QPS 的热点数据(如秒杀商品库存)。
3. 使用 Redis 复制机制(主从复制或集群)
核心思路:通过 Redis 读写分离,多个节点分担读取压力。
方案
- 主节点(Master)处理写请求,多个从节点(Slave)处理读请求。
- 结合 客户端负载均衡,将
get请求分发到不同的从节点。
示例(配置 Redis 读从库)
slaveof master_ip master_port
适用场景
- 适用于 Redis 集群模式,大规模热 Key 分布式缓存场景。
4. 采用批量 Key 轮换(Consistent Hash)
核心思路:通过一致性哈希(Consistent Hashing)降低热 Key 访问压力。
方案
- 将一个 Key 拆分成多个时间窗口 Key。
- 访问时随机选择一个 Key,确保热点数据均匀分布。
- 定期清理过时的 Key。
示例
String key = "hot_key:" + (time(nullptr) % 5); // 轮换 Key
redis.set(key, value);
适用场景
- 防止缓存击穿(热点数据定期轮换)。
- 适用于短周期热点数据(如秒杀、短时间访问高峰)。
5. 采用异步更新策略
核心思路:缓存失效后,先返回旧值,同时异步更新缓存,避免大量请求瞬间打到数据库。
方案
- 采用 双缓存(Double Cache) 机制:
- 用户查询时返回旧缓存。
- 后台异步更新新数据。
示例
String value = redis.get("hot_key");
if (value == null) {value = localCache.get("hot_key"); // 先从本地缓存读取asyncUpdateRedis(); // 后台线程更新 Redis
}
return value;
适用场景
- 避免缓存击穿问题(如商品价格、秒杀库存)。
6. 限流和降级
核心思路:如果 Redis 无法支撑高并发请求,可以限制请求频率,或者直接返回默认值。
方案
-
限流(使用令牌桶 / 滑动窗口)
- 限制相同 Key 的访问频率。
- 避免短时间内 Redis 负载过高。
-
降级(请求超时时返回默认值)
- 如果 Redis 繁忙,则返回本地默认值,减少 Redis 压力。
示例(限流)
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local current = redis.call('incr', key)if current == 1 thenredis.call('expire', key, 60) -- 60s 过期
endif current > limit thenreturn 0 -- 限流失败
end
return 1
适用场景
- API 访问频率控制(如抢购、直播点赞)。
7. 结合 MQ 做异步削峰
核心思路:将高并发请求写入消息队列(如 Kafka / RabbitMQ),异步处理,降低 Redis 访问压力。
方案
- 将请求写入 Kafka,批量处理。
- 后端定期刷新缓存,避免 Redis 承担高并发压力。
示例
// 生产者:将查询请求写入 MQ
kafkaProducer.send("hotKeyTopic", "hot_key");// 消费者:异步更新缓存
kafkaConsumer.onMessage(msg -> {String value = queryDatabase("hot_key");redis.set("hot_key", value);
});
适用场景
- 适用于秒杀、短时热点数据(如抢购、热点新闻)。
总结
| 方法 | 核心思路 | 适用场景 |
|---|---|---|
| 多级缓存 | L1(本地缓存)+ L2(Redis 缓存) | 低延迟读取,热点数据 |
| Key 预分片 | 拆分热 Key,分散访问压力 | 高并发计数(直播点赞、热点商品) |
| 主从复制 | 读写分离,提高读性能 | Redis 集群,读多写少 |
| 轮换 Key | 使用 Hash 轮转 Key | 秒杀库存、短时间热点数据 |
| 异步更新 | 先返回旧缓存,后台更新 | 价格、秒杀商品库存 |
| 限流和降级 | 限制访问频率,防止 Redis 过载 | 高 QPS 接口,秒杀抢购 |
| MQ 削峰 | 通过 Kafka / RabbitMQ 处理请求 | 高并发订单、热点数据 |
面试标准回答
解决 Redis 热 Key 主要有 3 类方法:
- 减少 Redis 访问压力(本地缓存、CDN、读写分离)。
- 分散 Key 访问(Key 预分片、轮换 Key)。
- 限制并发(限流、降级、MQ 削峰)。
最推荐的方案是:本地缓存 + Key 预分片 + Redis 读写分离,结合业务需求选择最优方案!🚀
相关文章:
Redis如何解决热Key问题
目录 **如何解决 Redis 的热 Key(Hot Key)问题?****解决方案** **1. 使用多级缓存****方案** **2. 进行 Key 预分片(Key Sharding)****方案** **3. 使用 Redis 复制机制(主从复制或集群)****方案…...
从开发到部署:EasyRTC嵌入式视频通话SDK如何简化实时音视频通信的集成与应用
嵌入式设备和视频综合管理平台均支持B/S架构。在B/S架构下,传统的视频观看方式依赖于微软的OCX控件,然而OCX控件的使用正面临越来越多的挑战: 首先,用户需要安装浏览器插件、调整浏览器安全级别,并允许ActiveX控件弹出…...
Zookeeper(58)如何在Zookeeper中实现分布式锁?
在 Zookeeper 中实现分布式锁是一种常见的用例。Zookeeper 提供了强一致性、高可用性的分布式协调服务,使得它非常适合用来实现分布式锁。以下是详细的步骤和代码示例,展示如何在 Zookeeper 中实现分布式锁。 1. Zookeeper 分布式锁的基本原理 Zookeep…...
Mac端homebrew安装配置
拷打了一下午o3-mini-high,不如这位博主的超强帖子,10分钟结束战斗 跟随该文章即可,2025/2/19亲测可行 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客文章浏览阅读10w次,点赞258次,收藏837次。一直觉得自己写…...
Spring 接入 DeepSeek
引入依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency>2.yml配置 spring:ai:openai:api-key: sk-xxxxx // 填写自己申请的keybase-url: http…...
vscode将文件中行尾默认CRLF改为LF
安装prettier npm install --save-dev --save-exact prettier执行命令 npx prettier --write --end-of-line lf .即可将项目中的所有文件行尾序列格式改为lf *在你使用git拉取代码的时候,git会自动将代码当中与你当前系统不同的换行方式转化成你当前系统的换行方…...
python-leetcode 33.排序链表
题目: 给定链表的头结点head,请将其按升序排列,并返回排序后的链表 方法一:自顶向下归并排序 链表自顶向下归并排序的过程: 1.找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以…...
【数据结构初阶第十二节】设计循环队列
云边有个稻草人-CSDN博客 必须有为成功付出代价的决心,然后想办法付出这个代价。 还有最后一道关于队列的习题,这题有点难,准备好迎接挑战吧! 目录 1.【题目】 2.实现循环队列推荐用数组,Why? 3.Q1:如…...
基于微信小程序的民宿短租系统设计与实现(ssm论文源码调试讲解)
第4章 系统设计 4.1系统设计的目标 系统设计的目标是满足用户的需求和满足系统实现所需要的所有要求。本系统收集了信息浏览、信息删除、信息添加、信息修改、信息查询为一体[17]。改变了用户民宿短租的方式,提高管理员管理效率以及用户预订的效率。为用户、房主提…...
使用 Jetty 构建 HTTPS 服务入门指南
在互联网安全越来越重要的今天,使用 HTTPS 为 Web 服务提供安全传输成为标准配置。Jetty 是一个高性能、易用且功能丰富的开源 Java HTTP 服务器和 Servlet 容器,能够轻松实现 HTTPS 支持。本文将结合代码实例,引导您快速搭建一个基于 Jetty 的 HTTPS 服务。 一、Jetty 简介…...
数据结构《图》
数据结构《图论》 图的性质 一、无向图(Undirected Graph) 定义 由一组顶点(Vertex)和一组无向边(Edge)构成。 每条无向边用一条无方向的线段连接两个顶点,记为 ( (u, v) ),其中…...
用Chrome Recorder轻松完成自动化测试脚本录制
前言 入门自动化测试,录制回放通常是小白测试首先用到的功能。而录制回放工具也一直是各大Web自动化测试必然会着重提供的一块功能。 早期WinRunner、QTP这样的工具,自动化测试可以说是围绕录制回放开展的。近年像Selenium也提供有录制工具 Selenium IDE,Playwright也包含…...
⭐️苹果电脑安装windows10双系统【详细图文步骤保姆级教程】【本教材适用于MAC台式机、笔记本MacBook air和pro】
苹果电脑安装windows10双系统【详细图文步骤保姆级教程】【本教材适用于MAC台式机、笔记本MacBook air和pro】 苹果电脑安装windows10双系统一、准备工作准备项1:U盘作为系统安装盘准备项2:您需要安装的系统镜像 二、启动转换助理步骤1:找到启…...
win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统
目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统,报错:Operating System not found 二、原因分析 国产系统,需要注意的点: 需要看你的系统类…...
Java 大视界 -- 开源社区对 Java 大数据发展的推动与贡献(91)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
深入浅出C语言内存模型——高阶篇
在C语言编程的征途上,内存管理无疑是最具挑战性的部分之一。今天,我们将深入探讨C语言的内存模型,剖析其高级特性,并通过一系列案例,助你成为内存管理的佼佼者。本文为高阶篇,适合已经有一定C语言基础的读者…...
AI 百炼成神:逻辑回归, 垃圾邮件分类
第二个项目:逻辑回归垃圾邮件分类 项目代码下载地址:https://download.csdn.net/download/m0_56366541/90398247 项目目标 学习逻辑回归的基本概念。使用逻辑回归算法来实现垃圾邮件的分类。理解如何处理文本数据以及如何评估分类模型的性能。项目步骤 准备数据集 我们将使…...
MybatisPlus-扩展功能
逻辑删除乐观锁 MyBatisPlus从入门到精通-3(含mp代码生成器) Db静态工具类 Spring依赖循环问题 代码生成器 MybatisPlus代码生成器 枚举处理器 我们这里用int来存储状态 需要注解,很不灵活 希望用枚举类来代替这个Integer 这样的话我…...
《计算机视觉》——角点检测和特征提取sift
角点检测 角点的定义: 从直观上理解,角点是图像中两条或多条边缘的交点,在图像中表现为局部区域内的灰度变化较为剧烈的点。在数学和计算机视觉中,角点可以被定义为在两个或多个方向上具有显著变化的点。比如在一幅建筑物的图像…...
DeepSeek模型快速部署教程-搭建自己的DeepSeek
前言:在人工智能技术飞速发展的今天,深度学习模型已成为推动各行各业智能化转型的核心驱动力。DeepSeek 作为一款领先的 AI 模型,凭借其高效的性能和灵活的部署方式,受到了广泛关注。无论是自然语言处理、图像识别,还是…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
