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

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)是指访问频率极高的键,在高并发场景下可能会造成:

  1. 单个 Redis 节点压力过大(大量请求命中一个 Key)。
  2. CPU 过载,响应变慢(甚至影响整个 Redis 集群)。
  3. 缓存失效后大量请求直接打到数据库,导致数据库崩溃(缓存击穿)。

解决方案

针对不同场景,解决方案主要包括 “分散请求”“降低 Redis 负载” 两个方向。


1. 使用多级缓存

核心思路:在 Redis 之前增加一级缓存,减少 Redis 访问压力。

方案

  1. 本地缓存(L1 Cache)

    • 在应用服务器上存储热点数据(如 Guava Cache, Caffeine)。
    • 优点:访问速度更快,避免 Redis 过载。
    • 缺点:如果多个应用服务器同时缓存相同 Key,可能会有数据一致性问题。
  2. 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 访问压力

方案

  1. 将一个 Key 拆分成多个时间窗口 Key
  2. 访问时随机选择一个 Key,确保热点数据均匀分布。
  3. 定期清理过时的 Key

示例

String key = "hot_key:" + (time(nullptr) % 5); // 轮换 Key
redis.set(key, value);

适用场景

  • 防止缓存击穿(热点数据定期轮换)。
  • 适用于短周期热点数据(如秒杀、短时间访问高峰)。

5. 采用异步更新策略

核心思路缓存失效后,先返回旧值,同时异步更新缓存,避免大量请求瞬间打到数据库。

方案

  • 采用 双缓存(Double Cache) 机制:
    1. 用户查询时返回旧缓存
    2. 后台异步更新新数据

示例

String value = redis.get("hot_key");
if (value == null) {value = localCache.get("hot_key");  // 先从本地缓存读取asyncUpdateRedis(); // 后台线程更新 Redis
}
return value;

适用场景

  • 避免缓存击穿问题(如商品价格、秒杀库存)。

6. 限流和降级

核心思路:如果 Redis 无法支撑高并发请求,可以限制请求频率,或者直接返回默认值

方案

  1. 限流(使用令牌桶 / 滑动窗口)

    • 限制相同 Key 的访问频率。
    • 避免短时间内 Redis 负载过高。
  2. 降级(请求超时时返回默认值)

    • 如果 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 访问压力。

方案

  1. 将请求写入 Kafka,批量处理。
  2. 后端定期刷新缓存,避免 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 类方法

  1. 减少 Redis 访问压力(本地缓存、CDN、读写分离)。
  2. 分散 Key 访问(Key 预分片、轮换 Key)。
  3. 限制并发(限流、降级、MQ 削峰)。
    最推荐的方案是:本地缓存 + Key 预分片 + Redis 读写分离,结合业务需求选择最优方案!🚀

相关文章:

Redis如何解决热Key问题

目录 **如何解决 Redis 的热 Key&#xff08;Hot Key&#xff09;问题&#xff1f;****解决方案** **1. 使用多级缓存****方案** **2. 进行 Key 预分片&#xff08;Key Sharding&#xff09;****方案** **3. 使用 Redis 复制机制&#xff08;主从复制或集群&#xff09;****方案…...

从开发到部署:EasyRTC嵌入式视频通话SDK如何简化实时音视频通信的集成与应用

嵌入式设备和视频综合管理平台均支持B/S架构。在B/S架构下&#xff0c;传统的视频观看方式依赖于微软的OCX控件&#xff0c;然而OCX控件的使用正面临越来越多的挑战&#xff1a; 首先&#xff0c;用户需要安装浏览器插件、调整浏览器安全级别&#xff0c;并允许ActiveX控件弹出…...

Zookeeper(58)如何在Zookeeper中实现分布式锁?

在 Zookeeper 中实现分布式锁是一种常见的用例。Zookeeper 提供了强一致性、高可用性的分布式协调服务&#xff0c;使得它非常适合用来实现分布式锁。以下是详细的步骤和代码示例&#xff0c;展示如何在 Zookeeper 中实现分布式锁。 1. Zookeeper 分布式锁的基本原理 Zookeep…...

Mac端homebrew安装配置

拷打了一下午o3-mini-high&#xff0c;不如这位博主的超强帖子&#xff0c;10分钟结束战斗 跟随该文章即可&#xff0c;2025/2/19亲测可行 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客文章浏览阅读10w次&#xff0c;点赞258次&#xff0c;收藏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拉取代码的时候&#xff0c;git会自动将代码当中与你当前系统不同的换行方式转化成你当前系统的换行方…...

python-leetcode 33.排序链表

题目&#xff1a; 给定链表的头结点head,请将其按升序排列&#xff0c;并返回排序后的链表 方法一&#xff1a;自顶向下归并排序 链表自顶向下归并排序的过程&#xff1a; 1.找到链表的中点&#xff0c;以中点为分界&#xff0c;将链表拆分成两个子链表。寻找链表的中点可以…...

【数据结构初阶第十二节】设计循环队列

云边有个稻草人-CSDN博客 必须有为成功付出代价的决心&#xff0c;然后想办法付出这个代价。 还有最后一道关于队列的习题&#xff0c;这题有点难&#xff0c;准备好迎接挑战吧&#xff01; 目录 1.【题目】 2.实现循环队列推荐用数组&#xff0c;Why? 3.Q1&#xff1a;如…...

基于微信小程序的民宿短租系统设计与实现(ssm论文源码调试讲解)

第4章 系统设计 4.1系统设计的目标 系统设计的目标是满足用户的需求和满足系统实现所需要的所有要求。本系统收集了信息浏览、信息删除、信息添加、信息修改、信息查询为一体[17]。改变了用户民宿短租的方式&#xff0c;提高管理员管理效率以及用户预订的效率。为用户、房主提…...

使用 Jetty 构建 HTTPS 服务入门指南

在互联网安全越来越重要的今天,使用 HTTPS 为 Web 服务提供安全传输成为标准配置。Jetty 是一个高性能、易用且功能丰富的开源 Java HTTP 服务器和 Servlet 容器,能够轻松实现 HTTPS 支持。本文将结合代码实例,引导您快速搭建一个基于 Jetty 的 HTTPS 服务。 一、Jetty 简介…...

数据结构《图》

数据结构《图论》 图的性质 一、无向图&#xff08;Undirected Graph&#xff09; 定义 由一组顶点&#xff08;Vertex&#xff09;和一组无向边&#xff08;Edge&#xff09;构成。 每条无向边用一条无方向的线段连接两个顶点&#xff0c;记为 ( (u, v) )&#xff0c;其中…...

用Chrome Recorder轻松完成自动化测试脚本录制

前言 入门自动化测试,录制回放通常是小白测试首先用到的功能。而录制回放工具也一直是各大Web自动化测试必然会着重提供的一块功能。 早期WinRunner、QTP这样的工具,自动化测试可以说是围绕录制回放开展的。近年像Selenium也提供有录制工具 Selenium IDE,Playwright也包含…...

⭐️苹果电脑安装windows10双系统【详细图文步骤保姆级教程】【本教材适用于MAC台式机、笔记本MacBook air和pro】

苹果电脑安装windows10双系统【详细图文步骤保姆级教程】【本教材适用于MAC台式机、笔记本MacBook air和pro】 苹果电脑安装windows10双系统一、准备工作准备项1&#xff1a;U盘作为系统安装盘准备项2&#xff1a;您需要安装的系统镜像 二、启动转换助理步骤1&#xff1a;找到启…...

win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统&#xff0c;报错&#xff1a;Operating System not found 二、原因分析 国产系统&#xff0c;需要注意的点&#xff1a; 需要看你的系统类…...

Java 大视界 -- 开源社区对 Java 大数据发展的推动与贡献(91)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

深入浅出C语言内存模型——高阶篇

在C语言编程的征途上&#xff0c;内存管理无疑是最具挑战性的部分之一。今天&#xff0c;我们将深入探讨C语言的内存模型&#xff0c;剖析其高级特性&#xff0c;并通过一系列案例&#xff0c;助你成为内存管理的佼佼者。本文为高阶篇&#xff0c;适合已经有一定C语言基础的读者…...

AI 百炼成神:逻辑回归, 垃圾邮件分类

第二个项目:逻辑回归垃圾邮件分类 项目代码下载地址:https://download.csdn.net/download/m0_56366541/90398247 项目目标 学习逻辑回归的基本概念。使用逻辑回归算法来实现垃圾邮件的分类。理解如何处理文本数据以及如何评估分类模型的性能。项目步骤 准备数据集 我们将使…...

MybatisPlus-扩展功能

逻辑删除乐观锁 MyBatisPlus从入门到精通-3&#xff08;含mp代码生成器&#xff09; Db静态工具类 Spring依赖循环问题 代码生成器 MybatisPlus代码生成器 枚举处理器 我们这里用int来存储状态 需要注解&#xff0c;很不灵活 希望用枚举类来代替这个Integer 这样的话我…...

《计算机视觉》——角点检测和特征提取sift

角点检测 角点的定义&#xff1a; 从直观上理解&#xff0c;角点是图像中两条或多条边缘的交点&#xff0c;在图像中表现为局部区域内的灰度变化较为剧烈的点。在数学和计算机视觉中&#xff0c;角点可以被定义为在两个或多个方向上具有显著变化的点。比如在一幅建筑物的图像…...

DeepSeek模型快速部署教程-搭建自己的DeepSeek

前言&#xff1a;在人工智能技术飞速发展的今天&#xff0c;深度学习模型已成为推动各行各业智能化转型的核心驱动力。DeepSeek 作为一款领先的 AI 模型&#xff0c;凭借其高效的性能和灵活的部署方式&#xff0c;受到了广泛关注。无论是自然语言处理、图像识别&#xff0c;还是…...

Hadamard稀疏注意力机制优化LLM长上下文处理

1. 项目背景与核心价值在大型语言模型&#xff08;LLM&#xff09;的实际应用中&#xff0c;长上下文处理一直是个棘手问题。传统Transformer架构的注意力机制存在O(n)复杂度&#xff0c;当序列长度超过2048 tokens时&#xff0c;显存占用和计算开销会呈指数级增长。这直接导致…...

胡桃讲编程:麻宫雅典娜模型-开发者的话

大家好&#xff0c;我是麻宫雅典娜 RVC 轻量翻唱模型的独立制作者。写下这篇开发者独白&#xff0c;没有繁杂的技术参数罗列&#xff0c;也没有格式化的版本公告&#xff0c;只想以创作者的视角&#xff0c;完整记录这款模型从半成品试水、意外诞生、紧急修 bug&#xff0c;到愚…...

【MCP 2026多模态部署终极指南】:20年一线专家亲授GPU显存压缩、跨模态对齐与低延迟推理3大实战范式

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;MCP 2026多模态部署全景认知与技术演进脉络 MCP&#xff08;Multimodal Cognitive Platform&#xff09;2026 是面向边缘-云协同场景的下一代多模态智能基础设施平台&#xff0c;其核心突破在于统一语义…...

B站缓存视频合并工具:Android平台如何3步实现离线弹幕播放?

B站缓存视频合并工具&#xff1a;Android平台如何3步实现离线弹幕播放&#xff1f; 【免费下载链接】BilibiliCacheVideoMerge &#x1f525;&#x1f525;Android上将bilibili缓存视频合并导出为mp4&#xff0c;支持安卓5.0 ~ 13&#xff0c;视频挂载弹幕播放(Android consoli…...

口碑好的中天光合叶绿素厂家

在农业种植领域&#xff0c;作物的生长状况和产量品质一直是农户们最为关心的问题。而叶片养护和光合作用效率的提升&#xff0c;更是其中的关键环节。不过&#xff0c;农户们在实际种植过程中&#xff0c;常常面临诸多痛点。许多作物在生长期间&#xff0c;会因土壤缺素&#…...

XUnity.AutoTranslator:Unity游戏实时翻译插件的完整配置指南

XUnity.AutoTranslator&#xff1a;Unity游戏实时翻译插件的完整配置指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因为语言障碍而错过了许多优秀的Unity游戏&#xff1f;XUnity.AutoTrans…...

巨人网络年营收50亿:同比增73% 扣非后净利21亿 斥资20亿理财 中东资本成第四大股东

雷递网 雷建平 4月27日巨人网络集团&#xff08;证券代码&#xff1a;002558 证券简称&#xff1a;巨人网络&#xff09;日前发布截至2025年的年报。年报显示&#xff0c;巨人网络2025年营收为50.47亿&#xff0c;较上年同期的29.22亿元增长72.69%。巨人网络2025年净利为17.55亿…...

烟台群策电子-FMC_M6678评估板

功能说明本子卡是一款面向国产M6678处理器的FMC转接卡。其提供标准的FMC HPC接口&#xff0c;可实现便捷的模块互联&#xff0c;既可作为国产M6678应用生态的评估平台&#xff0c;又能作为算力扩展节点&#xff0c;有效增强系统的整体处理能力。主要组成子卡实现了M6678的最小系…...

GPT5.5数据分析与商业智能实战从入门到提效2026最新

想稳定体验GPT-5.5的数据分析能力&#xff0c;推荐直接用库拉&#xff0c;这是一个AI聚合平台&#xff0c;已上线GPT-5.5&#xff0c;国内直连&#xff0c;注册即用。GPT-5.5来了&#xff0c;数据分析的工作方式正在被重写4月24日&#xff0c;OpenAI正式发布GPT-5.5。官方称这是…...

避坑指南:STM32硬件SPI与模拟SPI驱动W25Q64,哪种更适合你的项目?

STM32硬件SPI与模拟SPI驱动W25Q64的深度对比与选型指南 在嵌入式系统开发中&#xff0c;外部存储器的选择与驱动方式往往决定了项目的性能上限与开发效率。W25Q64作为一款64Mbit的串行Flash存储器&#xff0c;凭借其灵活的SPI接口和稳定的性能&#xff0c;成为众多STM32项目的首…...