什么是Redis大key问题?如何解决?

目录

Key多大算大呢?

识别big key

处理big key


Big Key是Redis中存储了大量的数据的Key,不要误以为big key只是表示Key的值很大,他还包括这个Key对应的value占用空间很多的情况,通常在String、list、hash、set、zset等类型中出现的问题比较多。其中String类型就是字符串的值比较大,其他几个类型就是其中元素过多的情况。

Redis的Big Key可能存在以下几个危害:

  1. 影响性能:由于big key的values占用的内存会很大,所以读取它们的速度会很慢,会影响系统的性能。
  2. 占用内存:大量的big key也会占满Redis的内存,让Redis无法继续存储新的数据,而且会导致Redis卡住。
  3. 内存空间不均匀:比如在 Redis 集群中,可能会因为某个节点上存储了Big Key,导致多个节点之间内存使用不均匀。
  4. 影响Redis备份和恢复:如果从RDB文件中恢复全量数据时,可能需要大量时间,甚至无法正常恢复。
  5. 搜索困难:由于大key可能非常大,因此搜索key内容非常困难,并且可能需要花费较长的时间完成搜索任务。
  6. 迁移困难:大对象的迁移和复制压力较大,极易破坏缓存的一致性。
  7. 逾期执行耗时:如果 Bigkey设置了过期时间,当过期后,这个 key会被删除,而大key的删除过程也比较耗时。

对于Big Key问题的处理,重点要在识别和解决上面。

Key多大算大呢?

Redis中多大的key算作大key并没有一个固定的标准,因为这主要取决于具体的场景和应用需求。一般来说,如果一个key的value比较大,占用的内存比较多,或者某个key包含的元素数量比较多,这些都可以被认为是大key。 、

通常情况下,建议不要超过以下设定,超过这些数量就会影响到Redis的性能。

  • 对于 String 类型的 Value 值,值超过 5MB(腾讯云定义是10M,阿里云定义是5M,我认为5M合适一点)
  • 对于 Set 类型的 Value 值,含有的成员数量为 10000 个(成员数量多)
  • 对于 List 类型的 Value 值,含有的成员数量为 10000 个(成员数量多)
  • 对于 Hash 格式的 Value 值,含有的成员数量 1000 个,但所有成员变量的总 Value 值大小为 100MB(成员总体积过大)

但是,这些并不是绝对的限制,而是一个经验值,具体的情况还需要根据应用场景和实际情况进行调整。

识别big key

在识别方面,Redis中的big key可以识别的程序是“redis-cli”,用户可以通过在终端中输入“redis-cli – bigkeys”来获取Redis中的big key。当redis-cli被调用时,它将搜索所有Redis数据库中包含大量内存数据的key,并且会将其保存在本地标准输出文件中:

# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type. You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).
Biggest string found so far 'mykey' with 160012 bytes
Biggest list found so far 'mylist' with 2304 items
Biggest set found so far 'myset' with 3220 members
Biggest zset found so far 'myzset' with 3220 members
Biggest hash found so far 'myhash' with 412 fields

处理big key

想要解决Big Key的问题,根据具体的业务情况有很多不同的方案,下面简单列举几个:

  1. 有选择地删除Big Key:针对Big Key,我们可以针对一些访问频率低的进行有选择性的删除,删除Big Key来优化内存占用。
  2. 除了手动删除以外,还可以通过合理的设置缓存TTL,避免过期缓存不及时删除而增大key大小。
  3. Big Key的主要问题就是big,所以我们想办法解决big的问题,那就是拆分呗,把big的key拆分开:
    1. 在业务代码中,将一个big key有意的进行拆分,比如根据日期或者用户尾号之类的进行拆分,使用小键替代大键可以有效减小存储空间,从而避免影响系统性能。
    2. 使用Cluster集群模式,将以大 key 分散到不同服务器上,以加快响应速度。
  4. 部分迁移:将大键放在单独的数据库中,从而实现对大键的部分迁移。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Vue创建cesium项目模版该如何选择?

目录 问题描述模版说明及选用建议小结 问题描述 刚入手这个项目,什么都是一知半解。使用Vue,创建Cesium项目的时候,提示需要选择一个模版(如下图所示),该如何选择项目模版选,总结如下: 模版说明…

大模型入门到精通——Prompt Engineering工程

Prompt Engineering 1. Prompt Engineering 的意义 在 LLM(大语言模型)时代,Prompt Engineering(提示工程)已经成为开发者与用户的重要技能和概念。随着大模型(如 GPT、GLM、BERT 等)的快速发…

8.26DEBUG

线程负责监听和处理不同的需求 顾客:代表需要被监控的文件句柄或网络socket,他们可能有各种需求,如点餐(发送数据)、询问菜品状态(读取数据)或需要帮助(异常处理) 菜单…

数据结构(邓俊辉)学习笔记】串 05——KMP算法:理解next[]表

文章目录 1.快速移动2.避免回溯3.通配哨兵 1.快速移动 在接下来这节,就让我们从严格的意义上来理解 next 表的具体含义及其原理。 我们已经切实地看到, KMP 算法的优化效果首先体现在它可以使模式串得以快速地后移,而不是如蛮力算法那样只…

【STM32单片机_(HAL库)】3-4-4【中断EXTI】【智能排队控制系统】项目实现

3-4-2系统框图及硬件接线 3-4-3系统代码框架搭建 4.软件—tasks.c文件编写 排队控制系统状态机 tasks.c #include "tasks.h" #include "led.h" #include "beep.h" #include "exti.h" #include "lcd1602.h" #include &…

22. K8S及DevOps

22. K8S及DevOps 一. 章节简介二. DevOps1. 简介2. CICD三. Kubernetes[1. 官网](https://kubernetes.io/zh-cn/)--------------------------------------------------------------------------------------------------------一. 章节简介 二. DevOps 1. 简介 2. CICD

【C语言】文件操作 (详细!!)

1、为什么使用文件 使用文件的原因:使用文件主要是为了在程序的执行过程中保存、读取和交换数据。文件提供了一种持久化存储数据的方式,使得程序在关闭后,数据不会丢失,可以被其他程序或后续的程序执行周期重新读取和处理。 1.0 什…

Spring Boot启用GZIP压缩

1.为什么是需要gzip压缩? 经常我们都会与服务端进行大数据量的文本传输,例如 JSON 就是常见的一种格式。通过 REST API 接口进行 GET 和 POST 请求,可能会有大量的文本格式数据提交、返回。然后对于文本,它有很高的压缩率&#x…

神经网络——最大池化

1.Pooling Layers讲解: 最大池化有时也被称为下采样,对应的有上采样。注意ceil_mode参数的使用 2.代码实战: import torch from torch import nn from torch.nn import MaxPool2dinputtorch.tensor([[1,2,0,3,1],[0,1,2,3,1],[1,2,1,0,0],…

react 的学习随记

npx create-react-app my-app 创建一个名叫my-app的react的项目 npm run eject 运行 显示config 文件夹 react jsx (使用时将babel 将jsx转为js) 单页面时需要引用 1,样式(在虚拟dom时) 1. 引用样式时 用classNa…

ESP8266通过WiFiManager实现Web配网

背景 一个项目中使用到了一款压力传感器,需要通过单片机实现数据的采集并发送到远程的服务器上,单片机采用的时ESP8266,通过WiFiManager实现局域网配置,以及远端服务器IP地址和服务端口的配置。发布此文章记录一下使用WiFiManager实现配网的方法。 程序流程图 示例代码 …

NLP发展脉络-->特征优化阶段

NLP特征优化阶段 文本预处理特征提取降维与特征选择特征组合与扩展特征选择与评估特征工程的优化模型可解释性偏统计和规则的特征化阶段优缺点优点缺点 这是NLP的一个发展阶段。今天,我们就来了解一下NLP的特征优化阶段。特征优化在NLP的发展中曾经是一个至关重要的…

day-40 合并区间

思路 将二维数组按照第一列升序排列&#xff0c;把intervals[0][0]作为第一个区间的起点&#xff0c;将 intervals[0][1]和intervals[1][0]进行比较&#xff0c;如果intervals[0][1]<intervals[1][0]&#xff0c;则不能合并&#xff0c;否则可以合并&#xff0c;将Math.max(…

基于OpenCV+MFC的KCF测速软件

基于OpenCVMFC的KCF测速软件 引言原理介绍使用介绍&#xff08;1&#xff09;主界面&#xff08;2&#xff09;打开视频&#xff08;3&#xff09;点击KCF测速&#xff08;4&#xff09;框选待检测目标&#xff08;5&#xff09;测速结果 资源链接&#xff08;包含源码&#xf…

QT WIN11 FluentUI APP开发

代码 import QtQuick import QtQuick.Controls import FluentUIItem {property bool autoPlay: trueproperty int loopTime: 2000property var modelproperty Component delegateproperty bool showIndicator: trueproperty int indicatorGravity : Qt.AlignBottom | Qt.Align…

Gazebo Harmonic gz-harmonic 和 ROS2 Jazzy 注意事项

激光显示 点呈现 射线呈现 rviz2 新旧版本并存的混乱 本教程旨在为在Ubuntu Jammy&#xff08;最新支持Gazebo Classic包的Ubuntu版本&#xff09;上运行Gazebo Classic&#xff08;如Gazebo 11&#xff09;的用户提供指导&#xff0c;这些用户计划将其代码迁移到新的Gazebo版…

两个实用的Python编程技巧

一、变量类型声明技巧 虽然在Python中可以不用声明变量的类型&#xff0c;但是为了加快程序的运算速度&#xff0c;减少不必要的bug&#xff0c;我们可以在定义变量之初就把它的类型确定&#xff0c;这样可以更好地传输变量值。如下面的例子。 我们定义了两个变量&#xff0c…

基于STM32开发的智能家居语音控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化语音识别处理设备控制与状态显示Wi-Fi通信与远程控制应用场景 家庭环境的语音控制办公室的智能化管理常见问题及解决方案 常见问题解决方案结论 1. 引言 随着人工智能技术的发展&…

Centos 添加双网卡 (生产环境配置记录)

1、在虚拟机中添加网卡2 [rootntpserver network-scripts]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo …

医疗器械法规笔记

目录 前言医疗器械法规体系医疗器械监管注册与备案前言 之前的文章中介绍了与软件开发过程中相关的法规(网络安全),同时介绍了如何查找相关行业标准,这些都是平时工作中遇到的细节问题,没有系统性的呈现出医疗器械法规相关的框架,一直想对法规与标准有一个全面的认识和总…