因为热Key和大Key,Redis终于被压崩了

大家好,我是洋子,今天分享一下在做压测时遇到的很有意思的性能问题以及对应的排查解决方案。这个性能问题的现象为,Redis线上实例不可用,Redis读写均超时

性能问题排查过程

先来看一下问题代码(Go语言实现),这段代码的含义为先从Redis当中读取数据,如果Redis里没有数据,则访问DB获取数据,获取到数据后再Set Redis缓存,便于下次访问直接从Redis 获取数据,减轻数据库压力

func GetInfoByCache(key string, expired int) interface{} {		strData, errCache := GetCacheData(ctx, key, expired)if errCache == nil {return strData}ret := GetInfoFromOther(params)  //访问数据库strJson, errJson := jsoniter.MarshalToString(ret[0].Interface())if errJson == nil {errSet := SetCacheData(ctx, key, strJson)if errSet != nil {ctx.Warning(errSet)}}return ret
}//调用该方法,传参当中的Redis Key只有一个,为固定值
res:=GetInfoByCache("Redis_Key_Name",60)

问题产生原因

如果是熟悉编程的小伙伴,应该知道上述业务逻辑是运用Redis缓存很基本的操作,即使是在高并发情况下,Redis 实例一般也能扛住,那问题到底出在哪里呢

有两个前置条件

调用GetInfoByCache方法时,Redis 的Key为固定值,即只有一个唯一的Key,另外这个Key还是一个大Key

  • 在Redis中,"大Key"通常指的是存储在数据库中的一个占用相对较大内存空间的键值对。当一个键值对的值非常大时,它可能会被称为大Key。这可能会对Redis服务器的内存占用过大、影响性能等负面影响,因此需要谨慎处理
  • Redis大Key不是指存储在Redis中的某个Key(键)的大小超过一定的阈值,而是该Key(键)所对应的value(值)过大

另外一个前置条件是,这个Redis的Key为固定值,在高并发条件下会成为一个热Key

Redis的"热Key"(Hot Key)指的是在一个Redis数据库中,某些特定的键(Key)被频繁地访问或者执行操作,导致这些键成为数据库中的热点。这通常是因为这些键存储了特别热门的数据,被大量的读取或写入操作所影响。

热Key可能对Redis的性能和稳定性产生负面影响,因为它们引起了数据库中的高并发访问。当某个Key变得热门时,可能会导致以下一些问题:

  • 性能瓶颈: 大量的读取或写入操作集中在一个热Key上,导致该Key所在的分片或节点成为性能瓶颈,因为它承受了大量的请求负担。
  • 响应延迟: 其他未热的Key可能因为竞争数据库资源而经历响应延迟,影响整体性能。
  • 内存占用: 热Key可能占用大量内存,导致Redis实例的内存使用率升高。如果Redis的内存用尽,可能导致LRU(最近最少使用)策略被触发,清除部分数据,进而影响业务

基于Redis 大Key以及热Key的前置条件下,进行压测,压测一旦到达指定的QPS就会发生下面的性能问题:

首先读取Redis开始出现失败,读Redis失败必然会进行访问数据库,并写入Redis,但写Redis又是写大Key,写入超时失败,再次影响Redis读请求,越来越多的Redis读请求失败,最终造成Redis的实例都不可用
请添加图片描述

解决方案

跟开发讨论后,制定了以下6种问题的解决方案,权衡成本和风险,最终采用了第2种方案,将Redis 的Key进行打散,这样就能解决Redis 热Key的问题,Redis读写请求可以落到不同的Redis分片上,最终解决了Redis实例不可用的性能问题
在这里插入图片描述

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

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

相关文章

Android 8.1 默认赋予应用权限

Android 8.1 默认赋予应用权限 最近接到项目需求,需要默认授予预置APP的应用权限以便操作使用,具体修改参照如下: /frameworks/base/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java private void grantDefau…

【CMake】1. VSCode 开发环境安装与运行

CMake 示例工程代码 https://github.com/LABELNET/cmake-simple 插件 使用 VSCode 开发C项目,安装 CMake 插件 CMakeCMake ToolsCMake Language Support (建议,语法提示) 1. 配置 CMake Language Support , Windows 配置 donet 环境 这…

RT-Thread: 基于STM32CubeMX配置驱STM32驱动的USB虚拟串口调试

关键词:USB 虚拟串口 USB虚拟串口,RT-Thread Studio,STM32 说明: 1:文档记录 STM32F103系列基于 RT-Thread 系统的 USB虚拟串口的开启及数据收发应用流程介绍。 2:本文以STM32F103C8T6型号做测试&#x…

【mysql】Mac安装mysql

1.安装mysql brew install mysql提示:We’ve installed your MySQL database without a root password. 2.给root用户设置密码 ##To connect run mysql -u root ##设置密码 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY a12345678*;3.启动…

计算机基础面试题 |16.精选计算机基础面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

卡码网Java基础课 | 4. A+B问题IV,5. A+B问题VIII

卡码网Java基础课| 4. AB问题IV,5. AB问题VIII 三元运算符4. AB问题IV5. AB问题VIII 三元运算符 普通if int a 10; int b 20; int c; if (a > b) {c a; } else {c b; }而三元运算符的结构如下: 会先求expression的值,如果为 true ,则…

SLB、DMZ、Nginx、Ingress、Gateway、Kibana和Grafana

SLB、DMZ、Nginx、Ingress、Gateway、Kibana和Grafana虽然有一些相似之处,但是它们的功能和适用场景还是有所不同。 SLB主要用于将大流量的请求分配到多个服务器上进行处理,从而提高系统的可伸缩性和可靠性。它适用于需要处理大流量的应用,如…

ANSIC的编译限制有哪些?

ANSIC(即C89,也称为ISO/IEC 9899:1989)标准中对编译器的限制。 主要体现在以下几个方面 1、函数形参数量上限 ANSIC规定的函数形参数量上限为31个。 2、函数调用时实参数量上限 ANSIC规定的函数调用时实参数量上限也是31个。 3、一条源…

Win10电脑关闭OneDrive自动同步的方法

在Win10电脑操作过程中,用户想要关闭OneDrive的自动同步功能,但不知道具体要怎么操作?首先用户需要打开OneDrive,然后点击关闭默认情况下将文档保存到OneDrive选项保存,最后关闭在这台电脑上同步设置保存就好了。接下来…

TypeScript 从入门到进阶之基础篇(九) Class类篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇TypeScript 从入门到进阶…

OCP NVME SSD规范解读-5.命令超时限制-2

Sanitize清除的数据很彻底,对FTL映射表、User Data(包括已经写入NAND和仍在cache里的)、Meta Data、安全密匙、CMB中SQ/CQ相关信息、可能含有用户数据的log等等会全部清除。不过,sanitize操作不会改变RPMB、boot分区、不包含用户数据的cache等内容。 RP…

用python实现调用达梦数据库

达梦数据库(Dameng Database)是一种关系型数据库管理系统,与常见的MySQL、Oracle等数据库系统类似。要使用Python连接并操作达梦数据库,你需要安装达梦数据库的Python驱动程序。 以下是一个使用Python连接达梦数据库的示例代码&a…

总420+,专业120+南京大学851信号与系统电子信息考研经验通信,电子信息

今年考研数学130,专业课120,总分420顺利被南京大学电通录取,梦圆南大,这一年的复习有过迷茫,有过犹豫,最后都坚持过来了,总结一下自己的复习经验,希望对大家有所帮助。数学 5-8月数…

关键字联合体union的定义和使用

联合体的定义 联合体的定义和结构体相同。 联合体成员共用存储空间,联合体占用的空间最大长度的数据成员的长度。 union State {char sleep;char run;int suspend;double error; }state_u;以上例子,State表示联合体的名字,它相当于声明了一…

Spark 中 BroadCast 导致的内存溢出(SparkFatalException)

背景 本文基于 Spark 3.1.1 open-jdk-1.8.0.352目前在排查 Spark 任务的时候,遇到了一个很奇怪的问题,在此记录一下。 现象描述 一个 Spark Application, Driver端的内存为 5GB,一直以来都是能正常调度运行,突然有一天,报…

HarmonyOS应用开发之ArkTS语言学习记录

1、ArkTS介绍 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。同时,提供了声明式UI、状态管理等相应的能力,让开发者…

JDBC-常用API

在上一篇文章里介绍了JDBC的概念、产生原因及简单使用。本篇将介绍JDBC的常用API,包括Connection,Statement, ResultSet, PreparedStatement。 一、Connection Connection是数据库的连接对象。有两个作用:(1)获取执行…

76.乐理基础-打拍子-二连音、四连音

内容来源于:三分钟音乐社 上一个内容:八三、八六拍的三角形打法-CSDN博客 这里要先理解了三连音的知识。 关于多少连音的总方针,其实就是两句话,如下图中的内容:二连音与四连音实际上就是下图中第二句话里的第一部分…

mmdetection训练自己的数据集

mmdetection训练自己的数据集 这里写目录标题 mmdetection训练自己的数据集一: 环境搭建二:数据集格式转换(yolo转coco格式)yolo数据集格式coco数据集格式yolo转coco数据集格式yolo转coco数据集格式的代码 三: 训练dataset数据文件配置config…

高防ip适合防御网站和游戏类的攻击吗?

​  作为站长,要学会并承受得住网站外来攻击的压力,尤其是所属为 DDoS 攻击高发行业的网站类业务及游戏行业,是很容易被竞争对手或者一些伪黑客爱好者盯上的。 加上,有些站长并没有提前了解,就盲目进军了这两个行业&…