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

【面试题】redis大key问题怎么解决?(key访问的次数比较多,key存的数据比较大)

针对 Redis 中大 Key(数据量大且访问频繁)的问题,需从 数据拆分、访问优化、架构设计 等多维度综合解决。以下是具体方案及实施步骤:


一、大 Key 的定义与危害

  • 定义
    • Value 过大:如 String 类型 Value > 10KB,集合类型(Hash/List/Set/ZSet)元素数量 > 1 万。
    • 访问频率高:单 Key 承担超过 50% 的请求,形成热点。
  • 危害
    • 内存不均:单 Key 占用内存过高,可能导致节点内存溢出。
    • 操作阻塞:大 Key 的读写(如 HGETALLLRANGE)耗时长,阻塞其他请求。
    • 集群倾斜:在 Redis Cluster 中,大 Key 无法分片,导致数据分布不均。
    • 网络瓶颈:频繁读取大 Key 占用带宽,影响整体吞吐量。

二、解决方案

1. 数据拆分:化整为零
  • 场景:适用于可分割的数据(如 Hash、List、ZSet)。
  • 方法
    • 垂直拆分:按字段/属性拆分到多个 Key。
      # 原始大 Key(Hash)
      HSET user:1 name "John" age 30 address "..." ...  # 100个字段# 拆分为多个子 Key
      HSET user:1:base name "John" age 30
      HSET user:1:detail address "..." ...
      
    • 水平拆分:按哈希分片或范围分片。
      # 将 List 拆分为多个子 List
      LPUSH user:1:logs_part1 "log1" "log2"...
      LPUSH user:1:logs_part2 "log3" "log4"...
      
  • 客户端适配:需在客户端聚合数据或分批次查询。
2. 数据结构优化:选择更高效的存储方式
  • 场景:存在冗余或低效的数据结构。
  • 方法
    • 压缩数据:对 String 类型使用压缩算法(如 GZIP、Snappy)。
      # 原始 JSON 数据(20KB)
      SET user:1:data "{...}"# 压缩后存储(节省 50%+ 内存)
      SET user:1:data_compressed "<压缩后的二进制数据>"
      
    • 替换数据结构
      • 将 String 存储的 JSON 转换为 Hash(按需存取字段)。
      • 用 ZSet 替代 List + Timestamp 组合,避免全量遍历。
3. 冷热分离:减少热 Key 压力
  • 场景:大 Key 中部分数据访问频率高(热数据),部分低频(冷数据)。
  • 方法
    • 拆分存储:将冷数据迁移到其他存储(如 MySQL、磁盘),热数据保留在 Redis。
    • 异步预热:通过定时任务将冷数据异步加载到缓存。
4. 架构优化:分散压力
  • Redis Cluster 分片:将大 Key 拆分为多个子 Key 分布到不同节点。
    # 客户端分片示例(按用户 ID 取模)
    shard_key = "user:" + (user_id % 3) + ":" + key_suffix
    
  • 代理层分片:使用 Twemproxy 或 Redis Cluster 自动路由请求。
  • 读写分离:通过 Redis 主从架构,将读请求分流到从节点。
5. 访问优化:降低单 Key 请求频率
  • 本地缓存:在客户端或代理层(如 Nginx)缓存热 Key 数据,减少 Redis 访问。
    # Python 客户端示例(使用 LRU 缓存)
    from functools import lru_cache@lru_cache(maxsize=1000)
    def get_user_data(user_id):return redis.get(f"user:{user_id}:data")
    
  • 批量操作:使用 Pipeline 或 Lua 脚本合并多个操作,减少网络开销。
    # Pipeline 批量获取拆分后的子 Key
    redis-cli --pipe << EOF
    GET user:1:base
    GET user:1:detail
    EOF
    
6. 监控与治理
  • 识别大 Key
    • 使用 redis-cli --bigkeys 扫描。
    • 通过 MEMORY USAGE key 查看具体内存占用。
  • 自动化治理
    • 设置阈值告警(如 Value > 5MB 时触发告警)。
    • 定期清理过期数据或拆分大 Key。

三、紧急情况处理

若大 Key 已引发性能问题,可临时采用以下措施:

  1. 异步删除:使用 UNLINK 替代 DEL,非阻塞删除。
  2. 限流降级:对热点 Key 的请求限流,避免压垮 Redis。
  3. 临时扩容:增加内存或节点,缓解短期压力。

四、预防措施

  1. 设计规范:在业务设计阶段避免集中存储大 Value。
  2. 容量规划:预估数据增长,提前分片或选择合适的数据结构。
  3. 代码审查:禁止在 Redis 中存储无过期时间的大 Key。

总结

解决 Redis 大 Key 问题的核心思路是 拆分数据、优化访问、分散压力。需根据业务场景选择组合方案,例如:

  • 高频访问的 Hash 大 Key → 拆分为子 Key + 客户端缓存 + Pipeline 批量操作。
  • 大 List 数据 → 分片存储 + 冷热分离 + 异步加载。
    通过持续监控与架构优化,可显著降低大 Key 对 Redis 性能的影响。

相关文章:

【面试题】redis大key问题怎么解决?(key访问的次数比较多,key存的数据比较大)

针对 Redis 中大 Key&#xff08;数据量大且访问频繁&#xff09;的问题&#xff0c;需从 数据拆分、访问优化、架构设计 等多维度综合解决。以下是具体方案及实施步骤&#xff1a; 一、大 Key 的定义与危害 定义&#xff1a; Value 过大&#xff1a;如 String 类型 Value >…...

web入侵实战分析-常见web攻击类应急处置实验1

场景说明&#xff1a; 某天运维人员发现在/opt/tomcat8/webapps/test/目录下&#xff0c;多出了一个index_bak.jsp这个文件&#xff0c; 并告诉你如下信息 操作系统&#xff1a;ubuntu-16.04业务&#xff1a;测试站点中间件&#xff1a;tomcat开放端口&#xff1a;22&#x…...

【Kubernetes】k8s 部署指南

1. k8s 入门 1.1 k8s 简介 需要最需要明确的就是&#xff1a;kubernetes&#xff08;简称 k8s &#xff09; 是一个 容器编排平台 &#xff0c;换句话说就是用来管理容器的&#xff0c;相信学过 Docker 的小伙伴对于容器这个概念并不陌生&#xff0c;打个比方&#xff1a;容器…...

深度解析:使用 Headless 模式 ChromeDriver 进行无界面浏览器操作

一、问题背景&#xff08;传统爬虫的痛点&#xff09; 数据采集是现代网络爬虫技术的核心任务之一。然而&#xff0c;传统爬虫面临多重挑战&#xff0c;主要包括&#xff1a; 反爬机制&#xff1a;许多网站通过检测请求头、IP地址、Cookie等信息识别爬虫&#xff0c;进而限制…...

iOS事件传递和响应

背景 对于身处中小公司且业务不怎么复杂的程序员来说&#xff0c;很多技术不常用&#xff0c;你可能看过很多遍也都大致了解&#xff0c;但是实际让你讲&#xff0c;不一定讲的清楚。你可能说&#xff0c;我以独当一面&#xff0c;应对自如了&#xff0c;但是技术的知识甚多&a…...

JDK最详细安装教程,零基础入门到精通,收藏这篇就够了

目录 一、下载与安装二、配置环境三、验证是否配置成功 一、下载与安装 1、下载地址 http://www.oracle.com/technetwork/java/javase/downloads/index.html 2、选择自己想要的版本下载&#xff0c;并且选择自己电脑对应的版本下载 3、下载完成之后&#xff0c;双击打开然后…...

深研究:与Dify建立研究自动化应用

许多个人和团队面临筛选各种网页或内部文档的挑战,以全面概述一个主题。那么在这里我推荐大家使用Dify,它是一个用于LLM应用程序开发的低代码,开源平台,它通过自动化工作流程的多步搜索和有效汇总来解决此问题,仅需要最小的编码。 在本文中,我们将创建“ Deepresearch”…...

新手向:SpringBoot后端查询到数据,前端404?(附联调时各传参方式注解总结-带你一文搞定联调参数)

前言&#xff1a; 在 Spring Boot 项目开发中&#xff0c;后端小伙伴可能经常遇到这样诡异的场景&#xff1a; 后台日志显示查询到了数据&#xff0c;但前端却一脸懵逼地告诉你 404 Not Found&#xff1f;接口明明写好了&#xff0c;Postman 直接访问却提示找不到&#xff1f…...

Mysql各操作系统安装全详情

" 至高无上的命运啊~ " MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的RDBMS (Relational Database Mana…...

RadASM环境,win32汇编入门教程之七

;运行效果 ;RadASM环境&#xff0c;win32汇编入门教程之七 ;在上一个教程里面&#xff0c;我们学习如何把数据显示出来。但是感觉太丑了&#xff0c;在这一教程里&#xff0c;我们来学习一下怎样让它们变漂亮点。 ;主要的内容是如何创建字体&#xff0c;设置字体的大小&#xf…...

STL之string类的模拟实现

目录 1. string的成员变量 2. string的成员函数 2.1 string类的c_str()和swap()函数 2.2 string类的构造 2.3 string类的拷贝构造 2.3.1传统写法&#xff1a; 2.3.2现代写法&#xff1a; 2.4string类的运算符重载 2.4.1传统写法&#xff1a; 2.4.2现代写法 2. 5 …...

定期自动统计大表执行情况

一、创建用户并赋权 create user dbtj identified by oracle default tablespace OGGTBS;grant connect,resource to dbtj;grant select any dictionary to dbtj;grant create job to dbtj;grant manage scheduler to dbtj; 二、创建存储表 1、连接到新建用户 conn dbtj/or…...

学习next.js的同时的一些英语单词记录

skip &#xff1a;跳过 optional&#xff1a;可选的 previous&#xff1a;以前的 lesson&#xff1a;课程 directory&#xff1a;目录 identical&#xff1a;相同的 instruction&#xff1a;说明 development server&#xff1a;开发服务器 client-side&#xff1a;客户…...

ok113i平台——qt+tslib支持usb触摸屏热插拔功能实现

问题&#xff1a;重新插拔设备&#xff0c;需要软件重启才能接收到触摸事件 愿因&#xff1a;是因为qt程序的tslib库的操作逻辑是在构造函数里面连接一次usb触摸设备&#xff0c;具体看如下文件内容&#xff1a; /home/forlinx/OK113i-linux-sdk/buildroot/buildroot-201902/dl…...

游戏引擎学习第112天

黑板&#xff1a;优化 今天的内容是关于优化的&#xff0c;主要讨论了如何在开发中提高代码的效率&#xff0c;尤其是当游戏的帧率出现问题时。优化并不总是要将代码做到最快&#xff0c;而是要确保代码足够高效&#xff0c;以避免性能问题。优化的过程是一个反复迭代的过程&a…...

深度学习笔记——LSTM

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的LSTM知识点。 文章目录 LSTM&#xff08;Long Short-Term Memory&#xff09;LSTM 的核心部件LSTM 的公式和工作原理(1) 遗忘门&a…...

基于SpringBoot的“食物营养分析与推荐网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“食物营养分析与推荐网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统首页界面 系统注册…...

23种设计模式 - 工厂方法模式

模式定义 工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;定义用于创建对象的接口&#xff0c;让子类决定实例化哪个类&#xff0c;从而将对象创建过程延迟到子类。其核心目的是解耦对象的创建与使用&#xff0c;增强系统的扩展…...

【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析①】

ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase01 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月16日 关键词&#xff1a;UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-001测试用例 用例ID测试场景验证要点参考条款预期结果TC…...

Discuz! X3.5 根目录权限设置

在 Discuz! X3.5 中,根目录的权限设置是确保网站安全性和功能正常运行的关键。如果权限设置不当,可能会导致文件无法访问、安全问题(如文件被篡改)或功能异常。以下是关于 Discuz! X3.5 根目录权限设置的详细说明和建议: 1. 根目录位置 Discuz! X3.5 的根目录通常是网站的…...

建筑兔零基础自学python记录22|实战人脸识别项目——视频人脸识别(下)11

这次我们继续解读代码&#xff0c;我们主要来看下面两个部分&#xff1b; 至于人脸识别成功的要点我们在最后总结~ 具体代码学习&#xff1a; #定义人脸名称 def name():#预学习照片存放位置path M:/python/workspace/PythonProject/face/imagePaths[os.path.join(path,f) f…...

React之旅-02 创建项目

创建React项目&#xff0c;常用的方式有两种&#xff1a; 官方提供的脚手架&#xff0c;官网&#xff1a;https://create-react-app.dev/。如需创建名为 my-app 的项目&#xff0c;请运行如下命令&#xff1a; npx create-react-app my-app 使用Vite包&#xff0c;官网&…...

uniapp 滚动尺

scale组件代码&#xff08;部分class样式使用到了uview1.0的样式&#xff09; <template><view><view class"scale"><view class"pointer u-flex-col u-col-center"><u-icon name"arrow-down-fill" size"26&qu…...

Redux中间件redux-thunk和redux-saga的具体区别是什么?

Redux 中间件是增强 Redux 功能的重要工具&#xff0c;redux-thunk 和 redux-saga 是两个常用的中间件&#xff0c;它们在处理异步操作和副作用时提供了不同的方式和理念。以下是两者的具体区别&#xff1a; 1. 概念与设计理念 redux-thunk 简洁&#xff1a;redux-thunk 是一…...

Windows 启动 SSH 服务

Windows 启动 SSH 服务 一、OpenSSH Server 安装 以 Win10 系统为例 打开设置 -> 系统 -> 可选功能 在 添加的功能 查看是否安装了 OpenSSH 服务 或者 OpenSSH Server 如果没有安装&#xff0c;找到 系统->添加可选功能 -> 查看功能->搜索 OpenSSH 服务 ->…...

rust笔记1-学习资料推荐

学习Rust的Trait、生命周期和模式确实需要一些时间&#xff0c;尤其是当这些概念在其他语言中不常见时。以下是一些学习资料和建议&#xff0c;帮助你更好地理解这些概念&#xff1a; 1. 官方文档与书籍 《The Rust Programming Language》&#xff08;俗称“The Book”&…...

MySQL 的存储引擎有哪些?它们之间有什么区别? MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别? MySQL 的索引类型有哪些?

MySQL 的存储引擎有哪些&#xff1f;它们之间有什么区别&#xff1f; 先来回顾以下我们业务场景下一般的数据库访问的过程应用——>server层 ——>存储引擎层——>磁盘 官网描述&#xff1a; InnoDB: MySQL 8.4 中的默认存储引擎。 InnoDB 是事务安全&#xff08;符…...

【Linux探索学习】第二十六弹——进程通信:深入理解Linux中的进程通信

Linux探索学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 在Linux操作系统中&#xff0c;进程通信&#xff08;IPC&#xff09;是操作系统的一项核心功能&#xff0c;用于在不同进程之间交换数据或…...

netcore https配置

一、生成证书 1. 安装 OpenSSL 如果尚未安装 OpenSSL&#xff0c;可以通过以下命令安装&#xff1a;Ubuntu/Debian:sudo apt update sudo apt install openssl CentOS/RHEL:sudo yum install openssl 2. 生成私钥 使用以下命令生成私钥文件&#xff08;private.key&#xff09…...

遥感影像目标检测:从CNN(Faster-RCNN)到Transformer(DETR)

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…...