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

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,将其加载到本地内存中。

相关文章:

redis大key和热key

redis中大key、热key 什么是大key大key可能产生的原因大key可能会造成什么影响如何检测大key如何优化删除大key时可能的问题删除大key的策略 热key热key可能导致的问题解决热key的方法 什么是大key 大key通常是指占用内存空间过大或包含大量元素的键值对。 数据量大&#xff…...

Dubbo 最基础的 RPC 应用(使用 ZooKeeper)

看国内的一些项目时 Dubbo 这个词经常闪现,一直也不以为然,未作搜索,当然也不知道它是做什么用的。直到最近阅读关于大型网站架构相关的书中反复提到 Dubbo 后,觉得不能再对它视而不见。Google 了一下,它是在阿里巴巴创…...

科技赋能:企业如何通过新技术提升竞争力的策略与实践

引言 在当今瞬息万变的商业环境中,科技的迅猛发展正在重新定义行业的游戏规则。无论是小型企业还是跨国巨头,都感受到数字化转型的迫切需求。过去,企业竞争力更多依赖于成本控制、资源调配或市场覆盖,而如今,新技术的引…...

从0开始深度学习(33)——循环神经网络的简洁实现

本章使用Pytorch的API实现RNN上的语言模型训练 0 导入库 import torch import torch.nn as nn import torch.nn.functional as F from torch.utils.data import Dataset, DataLoader from collections import Counter import re import math from tqdm import tqdm1 准备数据 …...

【FAQ】HarmonyOS SDK 闭源开放能力 — 公共模块

1.问题描述: 文档哪里能找到所有的权限查看该权限是用户级的还是系统级的。 解决方案: 您好,可以看一下下方链接是否可以解决问题: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/permissions-for-all-V…...

百度 文心一言 vs 阿里 通义千问 哪个好?

背景介绍: 在当前的人工智能领域,随着大模型技术的快速发展,市场上涌现出了众多的大规模语言模型。然而,由于缺乏统一且权威的评估标准,很多关于这些模型能力的文章往往基于主观测试或自行设定的排行榜来评价模型性能…...

内网不出网上线cs

一:本地正向代理目标 如下,本地(10.211.55.2)挂好了基于 reGeorg 的 http 正向代理。代理为: Socks5 10.211.55.2 1080python2 reGeorgSocksProxy.py -l 0.0.0.0 -p 1080 -u http://10.211.55.3:8080/shiro/tunnel.jsp 二:虚拟机配置proxifer 我们是…...

ubuntu22开机自动登陆和开机自动运行google浏览器自动打开网页

一、开机自动登陆 1、打开settings->点击Users 重启系统即可自动登陆桌面 二、开机自动运行google浏览器自动打开网页 1、安装google浏览器 sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i ./google-chrome-stable…...

企业建站高性能的内容管理系统

AnQiCMS 是一款高性能的内容管理系统,基于Go语言开发。它支持多站点、多语言管理,提供灵活的内容发布和模板管理功能,同时,系统内置丰富的利于SEO操作的功能,支持包括自定义字段、文档分类、批量导入导出等功能 AnQiC…...

【爬虫框架:feapder,管理系统 feaplat】

github:https://github.com/Boris-code/feapder 爬虫管理系统 feaplat:http://feapder.com/#/feapder_platform/feaplat 爬虫在线工具库 :http://www.spidertools.cn :https://www.kgtools.cn/1、feapder 简介 对于学习 Python…...

faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-5

训练过程 通过gdb调试得到这个ivfsq的训练过程,我尝试对这个内容具体训练过程进行解析,对每个调用栈里面的逻辑和代码进行解读。 步骤函数名称调用位置说明1faiss::IndexIVF::train/faiss/IndexIVF.cpp:1143开始训练,判断是否需要训练第一级…...

代码随想录算法训练营第六十天|Day60 图论

Bellman_ford 队列优化算法(又名SPFA) https://www.programmercarl.com/kamacoder/0094.%E5%9F%8E%E5%B8%82%E9%97%B4%E8%B4%A7%E7%89%A9%E8%BF%90%E8%BE%93I-SPFA.html 本题我们来系统讲解 Bellman_ford 队列优化算法 ,也叫SPFA算法&#xf…...

在嵌入式Linux下如何用QT开发UI

在嵌入式 Linux 环境下使用 Qt 开发用户界面 (UI) 是一个常见的选择。Qt 提供了丰富的功能、跨平台支持以及优秀的图形界面开发能力,非常适合用于嵌入式系统。以下是开发流程的详细步骤: 1. 准备开发环境 硬件环境 一块运行嵌入式 Linux 的开发板&…...

【JavaScript】Promise详解

Promise 是 JavaScript 中处理异步操作的一种强大机制。它提供了一种更清晰、更可控的方式来处理异步代码,避免了回调地狱(callback hell)和复杂的错误处理。 基本概念 状态: Pending:初始状态,既不是成功…...

1062 Talent and Virtue

About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about peoples talent and virtue. According to his theory, a man being outstanding in both talent and virtue must be a "sage(圣人)"…...

C++《二叉搜索树》

在初阶数据结构中我学习了树基础的概念以及了解了顺序结构的二叉树——堆和链式结构二叉树该如何实现,那么接下来我们将进一步的学习二叉树,在此会先后学习到二叉搜索树、AVL树、红黑树;通过这些的学习将让我们更易于理解后面set、map、哈希等…...

机器学习-神经网络(BP神经网络前向和反向传播推导)

1.1 神经元模型 神经网络(neural networks)方面的研究很早就已出现,今天“神经网络”已是一个相当大的、多学科交叉的学科领域.各相关学科对神经网络的定义多种多样,本书采用目前使用得最广泛的一种,即“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够…...

基于智能物联网关的车辆超重AI检测应用

超重超载是严重的交通违法行为,超重超载车辆的交通安全风险极高,像是一颗行走的“不定时炸弹”,威胁着社会公众的安全。但总有一些人受到利益驱使,使超重超载的违法违规行为时有发生。 随着物联网和AI技术的发展,针对预…...

记录pbootcms提示:登录失败:表单提交校验失败,请刷新后重试的解决办法

问题描述 pbootcms后台登录的时候提示“登录失败:表单提交校验失败,请刷新后重试!” 解决办法 删除runtime目录,或尝试切换PHP版本,选择7.3或5.6一般就能解决了。...

【JavaScript】同步异步详解

同步和异步是编程中处理任务执行顺序的两种不同方式。理解这两种概念对于编写高效和响应式的应用程序至关重要。 同步(Synchronous) 定义:同步操作是指一个任务必须在下一个任务开始之前完成。换句话说,代码按顺序执行&#xff…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络&#xf…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

云原生安全实战:API网关Kong的鉴权与限流详解

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...