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

Redis篇--常见问题篇4--大Key(Big Key,什么是大Key,影响及使用建议)

1、概述

大Key:通常是指值(Value)的长度非常大,实际上键(Key)长度很大也算。通常来说,键本身不会很长,占用的内存较少,因此判断一个键是否为bigKey主要看它对应的值的大小。
大Key分为两种情况:
(1)、键(Key)非常大
(2)、值(Value)非常大

2、键(Key)非常大

虽然Redis的键可以存储任意字符串(最大限制为512M),但通常情况下,键的长度都比较小。

过长的键会带来以下问题:
(1)、内存占用增加:Redis是内存数据库,键的长度直接影响内存使用。如果键的长度过大且大量存在时,会显著增加内存消耗。
(2)、性能下降:Redis的许多操作(如查找、删除、更新等)都需要对键进行哈希计算或字符串比较。如果键的长度过长,这些操作的时间复杂度会增加,导致性能下降。
(3)、网络传输开销:在客户端与Redis服务器之间传输数据时,过长的键会增加网络带宽的使用,尤其是在分布式系统中,可能会导致网络延迟。

什么时候算作"大键"?
- 一般大键:键的长度应尽量保持在100字节以内。超过这个长度的键可以被视为"大键"。
- 极端情况:如果键的长度超过几千字节,则会对Redis的性能产生明显影响,属于典型的"大键"。

如何避免大键?
(1)、使用简短的键名:尽量使用简短且具有描述性的键名。例如,使用user:12345而不是 user_profile_for_user_with_id_12345。
(2)、使用哈希或编码:对于复杂的键名,可以考虑使用哈希函数(如MD5、SHA1)将长字符串转换为固定长度的哈希值,或者使用Base64编码来缩短键的长度。

3、值(Value)非常大

Redis的值可以是多种类型的数据结构,包括字符串、列表、集合、哈希表、有序集合等。当值的大小非常大时,也会对Redis的性能和内存使用产生负面影响。

过长的值带来的问题
(1)、内存占用增加:大值会占用更多的内存,尤其是在Redis中存储大量大值时,可能会迅速耗尽可用内存。
(2)、性能阻塞:某些Redis操作(如GET、SET、DEL等)在处理大值时可能会阻塞Redis服务器,导致其他请求无法及时处理。例如,DEL一个包含数百万元素的列表或哈希表可能会导致Redis在几秒钟内无法响应其他请求。
(3)、网络传输开销:大值在客户端与Redis服务器之间传输时,会增加网络带宽的使用,可能导致网络延迟或超时。
(4)、备份和持久化压力:大值会增加Redis的RDB快照和AOF日志的大小,导致备份和持久化操作的时间变长,甚至可能引发磁盘I/O瓶颈。

什么时候算作"大值"?
- 一般建议:对于字符串类型的值,建议单个值的大小不要超过1MB。对于复杂数据结构(如列表、哈希表、集合等),建议每个元素的大小也应尽量控制在合理范围内。
- 极端情况:如果单个值的大小超过几十MB或几百MB,则会对Redis的性能产生显著影响,属于典型的"大值"。

如何避免大值?
(1)、分片存储:对于非常大的值,可以考虑将其拆分成多个小块进行存储。例如将一个大列表List拆分成多个较小的列表List存储。
(2)、使用压缩:对于文本或二进制数据,可以考虑使用压缩算法(如Gzip、Snappy)来减少值的大小。
(3)、使用外部存储:对于不适合存储在Redis中的大数据,可以考虑将其存储在其他专门的存储系统中(如Amazon S3、HDFS),并在Redis中只存储指向这些数据的引用(如URL或ID)。
(4)、使用流式处理:对于需要频繁读取或写入大值的场景,可以考虑使用Redis的流式处理功能(如XREAD和XADD),每次进读取部分数据,以避免一次性加载整个大值。

4、其他建议

(1)、优化数据结构:选择合适的数据结构来存储数据。例如,使用ZSET(有序集合)而不是HASH(哈希表)来存储带有权重的数据,或者使用LIST(列表)而不是SET(集合)来存储有序的元素。
(2)期清理过期数据:使用Redis的过期机制(EXPIRE、TTL)定期清理不再需要的大键或大值,避免长期占用内存。

5、如何检测大Key

(1)、使用MEMORY USAGE命令
可以使用MEMORY USAGE命令来检查某个键占用的内存大小。
例如:

MEMORY USAGE my_large_key

在这里插入图片描述
解释一下:
如上的示例可以看到键aaa1使用的内存大小是57字节。
我们从下面一行命令可以看到aaa1的键存储的值是zhangsan1,那么为什么Redis会分配57个字节呢?
答案:
因为Redis会为每一个key和value都创建一个对象头以记录key或value的类型,编码方式等附属信息;此外Redis的内存分配器jemalloc会分配比实际长度更大的空间保存数据,确保内存对齐和减少磁盘碎片;在加上各种底层数据结构不同也会占用一定的内存空间等,所以实际分配内存会比预想的大一些。
详细可以参考之前的Redis数据结构架构篇看下。

(2)、使用SCAN命令结合MEMORY USAGE
如果你不确定哪些键是大键,可以结合SCAN和MEMORY USAGE来批量检测。例如,编写一个脚本遍历所有键,并检查每个键的内存占用情况。
scan使用示例:
在这里插入图片描述

(3)、用Redis自带的监控工具
Redis提供了INFO memory命令,可以查看当前Redis实例的内存使用情况。你还可以使用Redis的慢查询日志(SLOWLOG)来检测哪些命令在处理大键时花费了较多时间。
命令示例:
在这里插入图片描述
说明:
used_memory:Redis分配的总内存量(以字节为单位)。
used_memory_human:used_memory转可读方式大小,方便阅读(如转KB、MB、GB)

(4)、使用第三方监控工具
一些第三方监控工具(如Redis Desktop Manager、RedisInsight、Prometheus + Grafana)可以帮助你实时监控Redis的内存使用情况,并识别出大键。

6、大Key总结

  • 大Key的定义:Redis中的"大 Key"既可以指键(Key)非常大,也可以指值(Value)非常大。无论是键还是值,过大的大小都会对Redis的性能和内存使用产生负面影响。通常在使用Redis过程中,不会存在过大的key,但是值却不好说,所以判断一个键是否为bigKey主要还是看它的值的大小。

  • 键非常大的影响:键过长会增加内存占用、降低性能,并增加网络传输开销。

  • 值非常大的影响:值过大会占用更多内存,导致阻塞操作、增加网络传输开销,并给备份和持久化带来压力。

  • 如何避免大Key:通过使用简短的键名、分片存储、压缩数据、使用外部存储等方式,可以有效避免大Key对Redis性能的影响。

  • 如何检测大Key:使用MEMORY USAGE、SCAN、INFO memory等命令或工具来检测和处理大 Key。

相关文章:

Redis篇--常见问题篇4--大Key(Big Key,什么是大Key,影响及使用建议)

1、概述 大Key:通常是指值(Value)的长度非常大,实际上键(Key)长度很大也算。通常来说,键本身不会很长,占用的内存较少,因此判断一个键是否为bigKey主要看它对应的值的大…...

谷歌浏览器 Chrome 提示:此扩展程序可能很快将不再受支持

问题现象 在Chrome 高版本上的扩展管理页面(地址栏输入chrome://extensions/或者从界面进入): , 可以查看到扩展的情况。 问题现象大致如图: 问题原因 出现此问题的根本原因在于:谷歌浏览器本身的扩展机制发生了…...

WebRTC服务质量(10)- Pacer机制(02) RoundRobinPacketQueue

WebRTC服务质量(01)- Qos概述 WebRTC服务质量(02)- RTP协议 WebRTC服务质量(03)- RTCP协议 WebRTC服务质量(04)- 重传机制(01) RTX NACK概述 WebRTC服务质量(…...

数据库的数据被清除了,该如何恢复?

当数据库的数据被清除时,恢复数据的难度和可能性取决于多种因素,包括数据清除的方式、数据库的类型、是否有备份等。以下是一些常见的数据库数据恢复方法: 一、基于备份的恢复 使用备份文件: 如果数据库有定期的备份&#xff0c…...

【西安电子科技大学考研】25官方复试专业课参考书目汇总

初试已经顺利考完啦、成绩已经公布,现在已经有很多同学来问学长学姐,复试参考书有哪些,复试应该做好哪些准备。故此学长学姐给大家整理好了西安电子科技大学各个学院的复试参考书目录,有需要的同学可以参考一下哈。大家可以结合本…...

【理解机器学习中的过拟合与欠拟合】

在机器学习中,模型的表现很大程度上取决于我们如何平衡“过拟合”和“欠拟合”。本文通过理论介绍和代码演示,详细解析过拟合与欠拟合现象,并提出应对策略。主要内容如下: 什么是过拟合和欠拟合? 如何防止过拟合和欠拟…...

fastjson诡异报错

1、环境以及报错描述 1.1 环境 操作系统为中标麒麟、cpu 为国产鲲鹏服务器。 jdk为openjdk version 1.8.0._242 1.2 错误 com.alibaba.fastjson2.JSONException: syntax error : f at com.alibaba.fastjson2.JSONReaderUTF16.readBoolValue(JSONReaderUTF16.java:6424) at c…...

面经zhenyq

如何去实现分层的动画效果? 在Unity中实现分层的动画效果,可以通过Animator的 Layer 功能实现。以下是详细步骤: 1. 什么是分层动画? 分层动画允许在同一个角色的不同部分同时播放独立的动画。例如: 上半身可以播放…...

GoFrame框架介绍

GoFrame是一款功能强大、设计精良且易用的Go语言开发框架,以下为你详细介绍它的相关特点和内容: ### 框架概述 GoFrame是为了提升Go语言开发者的编码效率以及项目的整体可维护性、可扩展性等而打造的开发框架,它涵盖了从基础的网络通信、数据…...

MapReduce工作流程+Shuffle机制

一、Mapreduce工作流程 (1)数据切片Split。数据切片数决定maptask并行度,默认情况下,一个切片大小块大小。切片不是针对整体数据集,而是针对每一个文件单独切片,所以会有小文件问题(CombineTex…...

JAVA8 Stream API 使用详解

Java 8 引入了 Stream API,它提供了对集合对象进行一系列操作的新方式,包括筛选、转换、聚合等。Stream API 的设计目标是提供一种高效且易于使用的处理集合数据的方式,同时支持并行处理。 以下是 Java 8 Stream API 的一些核心概念和使用详解…...

Redis 集群架构:高可用与扩展性

一、引言 在当今数字化时代,数据量呈爆炸式增长,对数据存储和处理的要求也越来越高。Redis作为一款高性能的键值对存储数据库,其集群架构在应对高并发、大数据量场景时展现出了独特的优势,成为众多企业构建高效、稳定系统的关键技…...

Redis数据对象

基本结构图 key和value指向的是redisObject对象 type:标识该对象用的是什么类型(String、List Redis数据结构 SDS SDS有4个属性: len:记录了字符串长度,因此获取字符串长度的时候时间复杂度O(1&#xff…...

Docker部署GitLab服务器

一、GitLab介绍 1.1 GitLab简介 GitLab 是一款基于 Git 的开源代码托管平台,集成了版本控制、代码审查、问题跟踪、持续集成与持续交付(CI/CD)等多种功能,旨在为团队提供一站式的项目管理解决方案。借助 GitLab,开发…...

python版本的Selenium的下载及chrome环境搭建和简单使用

针对Python版本的Selenium下载及Chrome环境搭建和使用,以下将详细阐述具体步骤: 一、Python版本的Selenium下载 安装Python环境: 确保系统上已经安装了Python 3.8及以上版本。可以从[Python官方网站]下载并安装最新版本的Python,…...

重温设计模式--4、组合模式

文章目录 1 、组合模式(Composite Pattern)概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式(Composite Pattern)概述 定义:组合模式是一种结构型设计模式,它允许你将对象组合成…...

5、mysql的读写分离

主从复制 主从复制的含义 主从复制:在一个mysql的集群当中,至少3台,即主1台,从2台。 当有数据写入时,主负责写入本库,然后把数据同步到从服务器。 一定是在主服务器写入数据,从服务器的写入…...

uniapp Native.js原生arr插件服务发送广播到uniapp页面中

前言 最近搞了个设备,需求是读取m1卡,厂家给了个安卓原生demo,接入arr插件如下,接入后发现还是少了一部分代码,设备服务调起后触发刷卡无法发送到uniapp里。 中间是一些踩坑记录,最后面是解决办法&#xf…...

如何在 Ubuntu 22.04 上安装 Elasticsearch

简介 在本教程中,你将学习如何在 Ubuntu 22.04 服务器上安装 Elasticsearch。此外,你还将学习如何使用 Elasticsearch REST API 索引和操作数据。 Elasticsearch 是一个基于 Apache Lucene Library 的免费分布式搜索和分析引擎。它是一个快速且可扩展的…...

单片机长耗时前后台任务优化

代码: void Task_10ms(void) {... }//改 void Task_2ms(void) {static uint8_t s_state 0switch(s_state){case 0:....s_state 1;break;case 1:....s_state 2;break;case 3:....s_state 1;break;default: //此段可以去除s_state 0;break; } } 参考链接 MCU长…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...