redis大key和热key

redis中大key、热key

    • 什么是大key
    • 大key可能产生的原因
    • 大key可能会造成什么影响
    • 如何检测大key
    • 如何优化
      • 删除大key时可能的问题
      • 删除大key的策略
    • 热key
      • 热key可能导致的问题
      • 解决热key的方法

什么是大key

大key通常是指占用内存空间过大或包含大量元素的键值对。

  1. 数据量大:存储的单个值(如字符串、列表、集合、哈希等)本身比较大。比如一个哈希里面有大量的K-V、一个字符串长文本等。
  2. 元素数量多:对于列表、集合、有序集合等数据结构,如果他们包含的元素非常多,也是大key。
  3. 嵌套结构复杂:当数据结构嵌套了很多层,整体内存占用较多。比如一个哈希里面某些字段又是哈希…。

具体多大才算大key没有固定标准,需要根据redis配置和业务需求来判定。一般来说,字符串类型key对应的value占用空间大于1M,集合类型元素数量超过5000个都可以视为大key。

在这里插入图片描述

大key可能产生的原因

  1. 程序设计不当或业务数据规模考虑不周
  2. 未及时清理垃圾数据
  3. 数据结构选择不合理
  4. 缺乏监控和管理

大key可能会造成什么影响

  1. 内存占用过高:占用大量内存,可能导致redis实例内存使用率升高。内存占用过高会触发redis内存淘汰策略,内存淘汰时可能会导致某些数据被意外删除从而影响正常业务。极端一点,内存耗尽导致redis实例崩溃导致服务中断。
  2. 内存碎片:内存碎片会降低内存使用率,使得即使有足够的空闲内存也无法为新数据分配连续的内存空间。
  3. 阻塞单线程:redis执行命令的时候是单线程,对大key进行读写操作时会更耗时,也就阻塞了其他的客服端请求。
  4. 网络拥塞:大key传输的网络流量就更大,更占网络宽带,导致网络堵塞,影响其他的请求。
  5. 主从同步延迟:大key网络传输的时间更长,增加网络传输的时间。
  6. 数据倾斜:redis集群中,如果某个节点上大key过多,该节点内存使用率就更高,集群资源就分布不均衡。

如何检测大key

  1. bigkeys命令:这是redis自带的命令,扫描整个库并统计每一种数据类型(string、list、set、zset、hash)中最大的那个key。它只能找每种类型最大的那一个key,不能找超过某个阈值的所有key。它是基于scan命令实现的,所以不会阻塞redis服务器。
  2. MEMORY USAGE命令(Redis 4.0及以上版本):它可以返回指定key的内存使用情况(字节为单位)。通过遍历所有的key可以找出大key。但是对于list、set等数据结构,它返回的是近似值,因为它采用抽样方式来估算内存使用。
  3. DEBUG OBJECT命令:它返回指定key的详细信息,包含可以的类型、编码方式、序列化后的长度等。但它可能会对redis服务器的性能产生一点的影响,生产环境不建议使用。
  4. 使用第三方工具:
    a. redis-rdb-tools:这是python编写的工具,用于解析redis的RDB快照文件,不仅可以提供每个key的大小信息,还能将结果导出为cvs文件。
    b. go-redis-bigkv:基于memory命令开发的go语言工具,用于扫描所有的key,并根据内存大小排序。可以把排序结果输出到txt文件中方便查看。
    c. Redis Bigkeys插件:用于分析redis大key的插件,扫描整个数据库,找出占用内存较大的key并输出。安装配置该插件后可以使用BIGKEYS命令来查找大key。
  5. 使用SCAN命令遍历:遍历所有的key,通过设置不同的MATCH和COUNT选项可以控制遍历的速度和范围。遍历过程中可以结合上述的MEMORY USAGE或TYPE等命令来获取每个key的大小和类型信息,从而筛选出大key。

检测大key时,应该尽量避免对redis服务器产生太大的影响。比如在从节点检测、在业务低峰时检测等。

如何优化

  1. 拆分大key:将大key拆分成多个小key,减少单个key的内存占用来提高查询性能。
  2. 使用压缩算法:对于一些可以压缩的数据类型,可以使用压缩算法来压缩减少内存占用。Redis本身支持一些压缩算法,如LZF(Lempel-Ziv-Fast)压缩算法。
  3. 设置过期时间:如果数据不是一直都需要的,可以设置过期时间,让redis自动删除该key,避免长期无效占用内存。
  4. 监控预警:建立监控预警机制,及时发现及时处理。可以使用Redis的监控工具,如Redis Insights、Prometheus等,设置对大key和内存使用的监控指标。

删除大key时可能的问题

  1. 阻塞redis服务:redis是单线程执行命令的,删除大key时耗时较长会阻塞其他请求。
  2. 内存释放问题:直接删除大key会导致大量内存被瞬间释放,对操作系统的的内存管理产生压力。删除大key导致的内存碎片,操作系统在处理这些内存碎片时会消耗一点的cpu资源。
  3. 网络流量消耗:存储在redis集群的大key,删除时会产生较大的网络流量。

删除大key的策略

  1. 分批删除:对于集合类型的大key,可以分批删除。每次删除一部分元素,最终完全删除这个大key。比如一个有1W元素的list,一次删除1K个元素,元素分多次删除,最终再删除这个key。
  2. 使用UNLINK命令:redis4.0版本开始,引入UNLINK命令来异步删除key。它会将key立即从数据库中删除,但实际释放内存的工作是后台线程来异步执行的。可以避免删除大key时阻塞redis的正常服务。
  3. 业务低峰时删除:
  4. 先重命名再删除:在删除前先将其重命名为一个不被使用的key,使其不会被业务系统访问到,然后再逐步删除这个重命名后的key。避免在删除过程中因为业务系统访问到该key而导致阻塞和错误。

热key

热key是指被频繁访问的key。

热key可能导致的问题

  1. 高并发访问:一个key被大量并发访问,对redis服务器性能产生压力。由于redis单线程,高并发访问导致响应变慢甚至无响应。
  2. 延迟增加:redis处理大量热key,导致redis服务整体的响应时间增加。
  3. 内存压力:频繁访问热key占用大量内存空间,导致redis内存使用率升高。内存使用率升高触发内存溢出甚至崩溃。
  4. 负载不均衡:当一个节点存在大量热key时,该节点负载非常高,其他节点相对空闲,导致redis集群整体性能下降,导致某些节点出现性能问题。

解决热key的方法

  1. 缓存分片:将热key分散到多个redis节点,减轻单个节点的压力。可以采用hash算法或一致性哈希算法将热key映射到不同的节点。
  2. 缓存过期策略:根据业务需求和访问频率设置不同的过期时间。
  3. 缓存预热:系统启动时预热一部分热key,将其加载到本地内存中。

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

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

相关文章

vue3实现自定义导航菜单

一、创建项目 1. 打开HBuilder X 图1 2. 新建一个空项目 文件->新建->项目->uni-app 填写项目名称:vue3demo 选择项目存放目录:D:/HBuilderProjects 一定要注意vue的版本,当前选择的版本为vue3 图2 点击“创建”之后进入项目界面 图…

Windows Qtcreator不能debug 调试 qt5 程序

Windows下 Qt Creator 14.0.2 与Qt5.15.2 正常release打包都是没有问题的,就是不能debug,最后发现是两者不兼容导致的; 我使用的是 编译器是 MinGW8.1.0 ,这个版本是有问题的,需要更新到最新,我更新的是Mi…

ubuntu20.04更换安装高版本CUDA以及多个CUDA版本管理

Ubuntu 20.04下多版本CUDA的安装与切换 CUDA安装配置环境变量软连接附上参考博客CUDA安装 cuda官方下载地址 因为我需要安装的是11.1版本的,所以这里按着11.1举例安装 安装命令如下: wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cu…

vue实现滚动条滑动到底部分页调取后端接口加载数据

一、案例效果 二、前提条件 接口返回数据 三、案例代码 子组件 const $emit defineEmits([cloneItem, updateList]);const props defineProps({rightList: {type: Array,},chartTableData: {type: Array as () > ChartListType[],},deleteChartInfo: {type: Object,}…

路面交通工具和个数识别,支持YOLO,COCO,VOC三种格式,带标注可识别自行车,摩的,公共汽车,装载机,面包车,卡车,轿车等

预处理 自动定向: 已应用 调整大小: 拉伸至 640x640 增强 每个训练示例的输出: 3 翻转: 水平 自行车 公交车

【05】Selenium+Python 两种文件上传方式(AutoIt)

上传文件的两种方式 一、input标签上传文件 可以用send_keys方法直接上传文件 示例代码 input标签上传文件import time from selenium import webdriver from chromedriver_py import binary_path # this will get you the path variable from selenium.webdriver.common.by i…

深入浅出剖析典型文生图产品Midjourney

2022年7月,一个小团队推出了公测的 Midjourney,打破了 AIGC 领域的大厂垄断。作为一个精调生成模型,以聊天机器人方式部署在 Discord,它创作的《太空歌剧院》作品,甚至获得了美国「数字艺术/数码摄影」竞赛单元一等奖。 这一事件展示了 AI 在绘画领域惊人的创造力,让人们…

[MRCTF2020]Transform

查壳,拖入64位IDA LOBYTE8位就是一个字节,在此处无意义,因为我们输入的本来就是按字节输入的 设 a byte_414040,bdword_40F040,cbyte_40F0E0,输入的字符串为flag; 从题目里得到 加密代码 a[i] flag[b[i]]; a[i] ^ b[i]; c a 即c[i] a[i…

如何通过智能生成PPT,让演示文稿更高效、更精彩?

在快节奏的工作和生活中,我们总是追求更高效、更精准的解决方案。而在准备演示文稿时,PPT的制作往往成为许多人头疼的问题。如何让这项工作变得轻松且富有创意?答案或许就在于“AI生成PPT”这一智能工具的广泛应用。我们就来聊聊如何通过这些…

深入浅出UART驱动开发与调试:从基础调试到虚拟驱动实现

往期内容 本专栏往期内容:Uart子系统 UART串口硬件介绍深入理解TTY体系:设备节点与驱动程序框架详解Linux串口应用编程:从UART到GPS模块及字符设备驱动 解UART 子系统:Linux Kernel 4.9.88 中的核心结构体与设计详解IMX 平台UART驱…

【docker】安装数据库脚本

mysql5.7 Docker启动mysql7并挂载文件关闭大小写敏感,【docker】安装mysql-CSDN博客 docker run \--name mysql -d -p 3306:3306 \-v /docker/data/mysql/data:/var/lib/mysql \-v /docker/data/mysql/conf:/etc/mysql/conf.d \-e MYSQL_ROOT_PASSWORD密码 \-e TZ…

1 ISP一键下载

BOOT0BOOT1启动模式说明0X用户Flash用户闪存存储器,也就是Flash启动10系统存储器系统存储器启动,串口下载11SRAM启动SRAM启动,用于在SRAM中调试代码 闪存存储器 是STM32 的内置FLASH,一般使用JTAG或者SWD模式下载程序时,就是下载…

1、Three.js开端准备环境

准备工作 从 CDN 导入 1.安装 VSCode 2.安装 Node.js 3.查看Three.js最新版本 4.如何cdn引入: https://cdn.jsdelivr.net/npm/threev版本号/build/three.module.js 例如:https://cdn.jsdelivr.net/npm/threev0.170.0/build/three.module.js 我们需要…

Java 反射(Reflection)

Java 反射(Reflection) Java 反射(Reflection)是一个强大的特性,它允许程序在运行时查询、访问和修改类、接口、字段和方法的信息。反射提供了一种动态地操作类的能力,这在很多框架和库中被广泛使用&#…

[保姆式教程]使用labelimg2软件标注定向目标检测数据和格式转换

定向目标检测是一种在图像或视频中识别和定位对象的同时,还估计它们方向的技术。这种技术特别适用于处理有一定旋转或方向变化的对象,例如汽车、飞机或文本。定向目标检测器的输出是一组旋转的边界框,这些框精确地包围了图像中的对象&#xf…

深度学习模型:卷积神经网络(CNN)

一、前言 CNN 的发展历程可以追溯到 20 世纪 80 年代和 90 年代。受生物视觉系统的启发,研究人员开始探索如何构建专门用于处理图像数据的神经网络。早期的一些研究奠定了基础,例如 Fukushima 提出的 Neocognitron 模型。 随着时间的推移,到…

Git上传本地项目到远程仓库(gitee/github)

目录 序言一、创建git本地版本库二、连接远程仓库(以gitee为例)三、将项目提交到git(本地)版本库1.由工作区添加到暂存区2.由暂存区添加到版本库 四、将代码由本地仓库上传到 gitee远程仓库1.获取远程库与本地同步2.把当前分支 ma…

Java 基础面试 题(Java Basic Interview Questions)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

人工智能与传统控制系统的融合发展

在这个科技快速迭代的时代,人工智能技术正以前所未有的速度改变着我们的生活。在控制系统领域,AI技术的引入为传统控制带来了新的发展机遇和挑战。然而,这并不意味着传统控制将被完全取代,相反,AI与传统控制的深度融合…

Linux服务器安装mongodb

因为项目需要做评论功能,领导要求使用mongodb,所以趁机多学习一下。 在服务器我们使用docker安装mongodb 1、拉取mongodb镜像 docker pull mongo (默认拉取最新的镜像) 如果你想指定版本可以这样 docker pull mongo:4.4&#…