Redis的big key问题介绍以及监控手段

本文目录:

1、big key的定义及问题

2、2023年实际生产事故

3、监控手段

4、预防手段

(一)big key的定义及产生的问题

Redis 的big key是指value占用内存空间较大的键值。通常,针对不同的数据类型会用元素个数或者占用空间大小来衡量bigKey:

String:value占用空间超过5MB(实际使用避免超过1MB);

集合(list,set,zset):成员数量超过1万个(实际使用避免超过2000个);

hash:field成员个数1000个,但value总大小超过100M(实际避免超过10MB);

Big Key对Redis系统性能会带来极其严重的影响,具体问题包括:

1、big key占用较大内存空间,在Redis集群中会造成严重的数据倾斜,存储分布不均匀;

2、当big key同时还是热点key时,还会造成访问倾斜,可能造成单节点访问出现异常;

3、对 big key的操作,尤其是批量操作,较耗时,时间复杂度达到O(N),会造成命令执行阻塞;

4、阻塞网络,bigkey数据较大,会对服务器网卡、所在网络产生一定的影响;

5、影响持久化。AOF重写和bgsave都会同步fork子进程,因为大key,导致写时复制比较耗时。

(二)2023年实际生产事故

1、A系统

现象:交易超时和成功率低预警,以及机房传输设备有端口心跳告警;

影响:用户相应功能不可用,影响用户体验;

原因:存在bigKey,且进行了批量操作(hgetall,hsetall),在交易并发量增大时,批量查询存储操作对Redis性能影响较大,查询缓慢进而导致交易超时。

分析:尽管Redis在Redis4.0引入了后台多线程,Redis6又引入了IO多线程,但Redis的主要命令执行依然是单线程的。如果对单个key进行批量操作,如hashKey的 hgetall,hsetall,执行的时间复杂度是O(N),当并发上来的时候,这种操作是非常低效的,很容易造成客户端阻塞。此外也可能会引发网络阻塞。因为每次获取大 key 产生的网络流量较大,举一个极端的例子,一个 key 的大小是 1 MB,每秒访问量为 1000,那么每秒会产生 1000MB 的流量,这对于普通千兆网卡的服务器来说是难以承受的。

总结:

开发者在使用Redis时要考虑性能的问题,使用Redis也并不是万事大吉,一定要遵循相应的开发规范。笔者建议查看阿里的Redis开发规范,里面也提到了对于big key、批量操作等典型的会阻塞整个主线程的问题。

2、B系统

现象:交易成功率低于最低告警值;

影响:用户查询功能报错,引起客诉;

原因:使用Redis时存在两个big key且还是热点key,且这两个key都在同一个master节点上(RedisCluster集群),导致在高峰期间对应节点访问流量过大,造成了严重的访问倾斜。

分析:并发较高的系统切记不可忽视big key,hot key的问题,热点问题就是其中要考虑的因素,尤其是像秒杀这种超高并发场景。如果把活动库存以 key-value这种简单方式存储到Redis中,抢购中就会出现上述的问题。

对于这种问题,我们可以通过两种方式解决。

1)增加一层本地缓存,减少Redis的访问,基本上多级缓存都这么干;

2)考虑到一致性的问题,用不了本地缓存,像秒杀场景的活动库存这种,就可以将热点key分散存储,一个key拆成多个子key存储。比如某电商进行茅台抢购活动,首先将茅台商品活动库存放到Redis中,茅台就是一个热点key,如maotai,1000,此时就可以将热点key分散存储,茅台抢购是需要预约的,可以将所有预约用户进行分组,Redis会根据组存储活动库存,key可以是 maotai:groupId1 300,maotai:groupId2 300,maotai:groupId3 400,通过这种方式把整个流量分散到不同的节点上,减轻单节点压力。

(三)监控手段

检测key本身会是一件非常耗时的工作,为了避免Redis的检测造成实际业务命令的阻塞,进行bigKey检测时不可在master节点进行,可以在从节点或者使用RDB文件快照进行检测。具体方案总结如下:

1、在从节点执行 --bigkeys命令

Redis天然支持bigkey的检索,通过该命令,Redis会统计每种数据类型的排名第一位的bigKey。这种方式的优点是会进行全量扫描,在对Redis业务数据存储不清楚的情况下使用。但它的缺点也是由于全量扫描带来的性能问题,一种解决方式是在该命令后加上时间间隔,即每隔多长时间扫描一次。 --bigkey -i 3,表示每隔100条指令就会休眠3秒。

2、在从节点执行SCAN命令

实际上bigkey的底层也使用SCAN命令执行,SCAN可以指定某种类型扫描,比如只扫描String,只扫描set类型,相比于直接使用bigkey,SCAN可以缩小扫描范围。

3、离线扫描RDB文件

可以使用redis-rdb-tools等工具离线扫描RDB文件,查看key的内存使用情况,该方案的优势是完全不影响在线Redis节点,完全离线操作。下面的命令是找出字节大于256的key:

rdb --command memory --bytes 256 dump.rdb

4、 慢查询监控

Redis支持对于慢查询的监控,当执行命令超过了设置的阈值之后,会自动将该操作添加到Redis的慢查询日志中,该日志是个链表结构。随后通过SLOWLOG GET命令可以查看到慢查询语句。通过观察慢查询也可查出bigkey的问题。首先要配置慢查询的阈值:

CONFIG SET slowlog-log-slower-than 2

5、Redis时延、带宽等监控

   big key的操作会对时延、带宽消耗产生一定的影响,因此对此进行监控可及时发现异常情况。

(四)预防手段

最好的监控就是预防,在写业务代码时,就必须提前考虑big key出现的场景,要提前做好规避方案,主要手段包括:

1、分治,将整个Key进行分片存储,将key打散,减小单key的大小;

2、压缩,可对value值进行序列化、压缩,减小value的存储大小;

3、对 大key操作避免使用批量,避免产生长时间阻塞;

4、对大key进行删除不可用del命令,要使用unlink异步操作;

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

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

相关文章

2024年混合云:趋势和预测

混合云环境对于 DevOps 团队变得越来越重要,主要是因为它们能够弥合公共云资源的快速部署与私有云基础设施的安全和控制之间的差距。这种环境的混合为 DevOps 团队提供了灵活性和可扩展性,这对于大型企业中的持续集成和持续部署 (CI/CD) 至关重要。 在混…

基于springboot+vue的阿博图书馆管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

JRE和JVM的区别

JRE(Java Runtime Environment,Java运行环境)和JVM(Java Virtual Machine,Java虚拟机)是Java运行时环境的重要组成部分,它们之间主要有以下区别: 功能不同:JRE是Java运行…

Pandas 数据结构 – Pandas CSV 文件

Pandas CSV 文件 CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。 CSV 是一种通用的、…

06. 【Linux教程】终端工具

Linux 终端工具 前面介绍了如何安装虚拟机,还介绍了如何在虚拟机上安装 CentOs 操作系统,并且给 CentOs 配置了局域网固定 ip,那么此时的 CentOs 相当于是在局域网的一台服务器了,虚拟机上面已经自带终端工具,实际业务…

上传upload及显示img图片预览、删除

上传图片文件a-upload html部分 <div className="clearfix"><a-upload:custom-request="customRequest"listType="picture-card":fileList="fileList":onPreview="handlePreview":on-remove="del">&…

day39_mysql

今日内容 0 复习昨日 1 DML 2 约束 3 DQL 0 复习昨日 1 什么是数据库(Database)? 用来组织,存储,管理数据的仓库 2 什么是数据库管理系统(Database Management System-DBMS)? 用来管理数据库的一个软件 3 数据库分类 关系型数据库,Oracle,Mysql,SqlServer,DB2非关系数据库,Re…

【android】 android->profile 查看内存泄露

目录 实例讲解 各字段解释 实例讲解 各字段解释 在 Android Studio 的 Profile 视图中&#xff0c;Arrange by Stack 用于对内存分配和释放事件进行堆栈排列&#xff0c;以便更好地了解内存使用情况。以下是表上各列的一般含义&#xff1a; 1. **Call Chart (调用图)**: …

【Qt】—— Qt Creator 创建项目

目录 &#xff08;一&#xff09;Qt Creator概览 &#xff08;二&#xff09;使⽤Qt Creator新建项⽬ &#xff08;一&#xff09;Qt Creator概览 从开始菜单或者快捷⽅式打开Qt Creator集成开发环境&#xff0c;启动之后看到类似下⾯的界⾯&#xff1a; 【解释说明】 菜单栏…

ES6中新增Array.from()函数的用法详解

目录 Map对象的转换 Set对象的转换 字符串的转换 类数组对象的转换 Array.from可以接受三个参数 ES6为Array增加了from函数用来将其他对象转换成数组。当然&#xff0c;其他对象也是有要求&#xff0c;也不是所有的&#xff0c;可以将两种对象转换成数组。 1、部署了Iter…

代码安全审计经验集(下)

对HTTP加密请求参数的测试 对于HTTP请求体加密&#xff0c;如果直接使用明文的请求参数&#xff0c;是无法进行正常的安全测试的。但通常还是有办法分析出加解密的策略&#xff0c;如果能把加解密算法还原&#xff0c;就可以先将安全测试的payload添加到原始明文参数&#xff0…

python学习_win32 实现模拟键盘输入或者鼠标移动的方法

1.方法一 参考文档 https://blog.csdn.net/qq_45664055/article/details/123573468ctypes 是一个 Python 库&#xff0c;它提供了调用 C 代码的功能。使用 ctypes 可以调用 Windows API 函数&#xff0c;包括鼠标和键盘的操作。 1.1模拟鼠标操作&#xff1a; from ctypes im…

SpringBoot统一功能处理,拦截器,统一数据格式,捕捉异常

目录 拦截器:是Spring框架提供的核心功能之一&#xff0c;主要用来拦截用户的请求&#xff0c;在指定方法前后&#xff0c;根据业务需要执行预先设定的代码: 自定义拦截器 统一数据格式&#xff0c;要包含状态码&#xff0c;错误信息​编辑 出现针对String类型的错误​​​…

【Linux C | 网络编程】netstat 命令图文详解 | 查看网络连接、查看路由表、查看统计数据

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

MBP 2015安装Ubuntu 22.04.3系统后摄像头驱动问题解决

# 表示root用户, 如果更喜欢 sudo 也可以使用 sudo$ 表示普通用户 安装缺失的Ubuntu依赖以解压固件 (# apt install xz-utils curl cpio make)解压和安装固件请参考 Firmware extraction.安装依赖: (# apt-get install linux-headers-generic git kmod libssl-dev checkinsta…

【Java万花筒】选择你的武器:移动开发的多面利器大揭秘

Java移动开发全景图&#xff1a;从Android SDK到跨平台框架一网打尽 前言 移动应用开发正迎来飞速发展的时代&#xff0c;选择合适的开发库成为开发者关注的焦点。本文深入探讨了多个Java库&#xff0c;涵盖Android SDK、RoboVM、Codename One、Xamarin、Flutter以及React Na…

【AI数字人-论文】Geneface论文

文章目录 前言pipelineaudio-to-motionMotion domain adaptation可视化 Motion-to-imageHead-NeRFTorso-NeRF 结果对比 前言 语音驱动的说话人视频合成旨在根据一段输入的语音&#xff0c;合成对应的目标人脸说话视频。高质量的说话人视频需要满足两个目标&#xff1a; &#…

Redis简介和数据类型

简介 Redis是完全开源&#xff08;BSD许可&#xff09;的内存数据结构存储&#xff0c;是一个高性能的 key-value 数据库&#xff0c;用作数据库、缓存、消息代理和流式处理引擎。 Redis 提供数据结构&#xff0c;例如字符串、哈希、列表、集、带有范围查询的排序集、位图、超…

【INTEL(ALTERA)】内部错误:子系统:QHD,文件:/quartus/comp/qhd/qhd_design.cpp

说明 由于英特尔 Quartus Prime 专业版软件 23.2 及更早版本存在问题&#xff0c;在使用 GUI 对设计进行完整编译后&#xff0c;您可能会看到此内部错误。 此错误仅发生在 GUI 中&#xff0c;在命令行中不会发生。此问题也仅出现在面向 Intel Agilex 7 设备的设计中。 解决方法…

ele-h5项目使用vue3+vite开发:第二节、search 搜索框组件开发

如何设计一个组件 需求分析 布局 content left-iconbodyinput-controlright-iconaction 功能 使用 defineEmits 定义组件的事件 在组件的script setup 里如何定义事件 使用defineEmits&#xff08;&#xff09;定义先声明事件接口 <script setup lang"ts"> int…