大厂面试官问我:Redis中热key和大key是怎么解决的?【后端八股文五:Redis热key和大key八股文合集】

news2024/11/23 21:35:13

  往期内容:

大厂面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文一:Redis点赞八股文合集】-CSDN博客

大厂面试官问我:布隆过滤器有不能扩容和删除的缺陷,有没有可以替代的数据结构呢?【后端八股文二:布隆过滤器八股文合集】-CSDN博客

大厂面试官问我:Redis持久化RDB有没有可能阻塞?阻塞点在哪里?【后端八股文三:Redis持久化八股文合集】-CSDN博客

大厂面试官问我:Redis内存淘汰,LRU维护整个队列吗?【后端八股文四:Redis内存淘汰策略八股文合集】-CSDN博客

本文为【Redis热key和大key八股文合集】初版,后续还会进行优化更新,欢迎大家关注点赞评论交流~

大家第一眼看到这个标题,不知道心中是否有答案了?在面试当中,面试官经常对项目亮点进行深挖,来考察你对这个项目亮点的理解以及思考!这个时候,你如果可以回答出面试官的问题,甚至是主动说出自己的思考,那在面试中是大大加分的~

Redis的热key

热key:
某个Key接收到的访问次数、显著高于其它Key时,称之为热Key。

热key带来的问题:
大量请求直接打过来,服务器可能会扛不住,造成缓存击穿从而直接打挂后端存储(数据库),影响其他使用后端存储的业务。
可能使得redis的集群失去意义,Redis Cluster中各node流量不均衡造成Redis Cluster的分布式优势无法被利用,一个分片负载很高而其它分片十分空闲。

产生原因:
未定期清理数据,没有设置过期时间,造成了如hash类型中key中的成员不断增加。
流量陡增,如出现某款爆款商品等(热key)。
bug,代码的业务逻辑上对key的成员只增不减也未设置过期时间。

热key的过期问题

1、手动删
2、通过Redis配置动态过期时间:
Redis提供了一个叫做“动态过期时间”的功能,可以在key即将过期时,重新计算过期时间,并通过Redis的expire命令设置新的过期时间。
3、使用Redis集群:
Redis集群是多个Redis节点的集合,每个节点都存储部分数据,整个集群作为一个虚拟服务器来对外提供Redis服务。在Redis集群中,热点key会被分配到不同的节点进行存储,从而避免了单节点内存溢出的问题。
4、使用Redis的LRU机制:
Redis 提供了一种名为“最近最少使用”的数据淘汰机制(LRU),可以将长时间不使用的热点key清除出Redis缓存。

Redis热Key问题怎么解决?


热key的处理方法有三种:
 

(1)复制:
在使用redis集群时,可以将热key复制多份,每个redis节点上存放一份,这样不存在请求的重定向使得压力全部定向到单个节点,能有效减轻单节点的压力。缺点是要进行复制的画只能在代码层手动操作,而且复制多份存放后会存在数据一致性问题。因此复制方案只能用于临时解决线上问题。
(2)读写分离:
热key多数是读热key的操作,读写分离能保证从节点中数据的一致性,并且能轻松的横向扩展,能有效的分散压力,只是有点浪费资源,因为读写分离每个从节点上存的都是一样的数据。
(3)多级缓存:
当热key数量不多,比如电商平台促销活动,热key都集中在少部分key上面,为此做读写分离增加机器性价比不高,使用多级缓存是个不错的解决方法。具体实现思路两种:
1.本地缓存,redis和业务服务器之间增加一个中间层(proxy),专门用来进行热key探查,这个proxy专门用来监视redis来统计达到预设的热key阈值的key,统计好后推送给业务服务器,让业务服务器存在本地缓存。
2.单独缓存,将proxy探查到的热key推送到单独的一个缓存热key的redis上去,如果扛不住,热key服务器再横向扩容,当然这个方案也是单独增加了服务器结点去处理热key的,除非保证系统中经常会有热key出现,不然的话使用本地缓存性价比更高。
使用多级缓存会存在一个问题,因为每次推送之间有时间间隔,缓存中的数据和redis中的数据不是呈现强一致性的,而是呈现最终一致性的。这种代价也是不得不接受的,在使用缓存的时候注意不要拿缓存做逻辑,只用来做查询即可。

Redis的热key怎么存放?

可以使用带有过期时间的键值对来存储热key,合理设置过期时间,让热key定期失效。

对于写入频繁的热key,可以考虑使用分布式锁或队列机制来限流。

对于读取频繁的热key,可以使用缓存策略,例如LRU/LFU等淘汰策略来减轻Redis的压力。

如何解决热key带来的redis宕机问题(热key读,热key写) / 一个热key导致单台机访问流量过高,该怎么办?

采用Redis集群或者Redis Sentinel架构,将数据分散到多个节点上,避免单点故障。

为热key设置合理的过期时间,让热key定期失效。

使用分布式锁或限流机制来控制对热key的写入请求。

对于读取频繁的热key,可以使用本地缓存或者CDN来分担Redis的压力。

Redis如何分析热key?key的占用大小?

可以使用Redis的info命令查看各个key的访问频率,从而识别出热key。

也可以使用Redis Enterprise或者其他监控工具,对Redis的访问情况进行分析,定位热key。

对于key的占用大小,可以使用object encoding命令查看。

如果分布式数据库中某一个分片具有热key导致一直被访问怎么去解决

采用sharding技术,将数据按照certain规则分散到不同的分片上,避免单一分片承担过大的访问压力。

对于频繁访问的热key,可以使用缓存机制,将数据缓存在应用层或者其他缓存层,减轻数据库的压力。

监控各个分片的访问情况,及时发现和处理热key问题。可以考虑将热key迁移到其他分片上。

Redis的大Key

这个问题就是Redis中某个key的value过大,所以Big Key问题本质是Big Value问题,导致Redis的性能下降或者崩溃。

产生原因

存放不合理,存储了不适合存放在内存中的数据,如用key存放音频视频这一类大体积二进制文件(大key)。
设计不合理,造成个别key中成员过多。(大key)。

性能下降原因


因为Redis需要将大key全部加载到内存中,这会占用大量的内存空间,会降低Redis的响应速度,这个问题被称为Big Key问题。

在Redis中,大key通常是由以下几种原因导致的:

对象序列化后的大小过大

存储大量数据的容器,如set、list等

大型数据结构,如bitmap、hyperloglog等
(如果不及时处理这些大key,它们会逐渐消耗Redis服务器的内存资源,最终导致Redis崩溃。)

或者

大key:
含有较大数据或含有大量成员的Key称之为大Key,常见的大key如:
String类型的Key值大于10kb
list、set、zset、hash的成员个数超过5000
list、set、zset、hash的成员数量虽然只有1000个但这些成员的value总大小为100MB

排查方法


Redis自带的 BIGKEYS 命令可以查询当前Redis中所有key的信息,对整个数据库中的键值对大小情况进行统计分析

由于BIGKEYS命令需要扫描整个数据库,所以它可能会对Redis实例造成一定的负担。在执行这个命令之前,请确保您的Redis实例有足够的资源来处理它,建议在从节点执行。

解决方案,以及如何避免

(分段,切割,序列化)
(1)分割大key
将Big Key拆分成多个小的key。这个方法比较简单,但是需要修改应用程序的代码。就像是把一个大蛋糕切成小蛋糕一样,有点费力,但是可以解决问题。
或者尝试将Big Key转换成Redis的数据结构。例如,将Big Key转换成Hash,List或者Set等数据结构。

(2)对象压缩
如果大key的大小主要是由于对象序列化后的体积过大,我们可以考虑使用压缩算法来减小对象的大小。Redis自身支持多种压缩算法,例如LZF、Snappy等。

(3)直接删除
如果你使用的是Redis 4.0+的版本,可以直接使用 unlink命令去异步删除。4.0以下的版本 可以考虑使用 scan ,分批次删除。

无论采用哪种方法,都需要注意以下几点:

避免使用过大的value。如果需要存储大量的数据,可以将其拆分成多个小的value。就像是吃饭一样,一口一口的吃,不要贪多嚼不烂。

避免使用不必要的数据结构。例如,如果只需要存储一个字符串,就不要使用Hash或者List等数据结构。

定期清理过期的key。如果Redis中存在大量的过期key,就会导致Redis的性能下降。就像是家里的垃圾,需要定期清理。

对象压缩

Redis大key的弊端?

内存占用高:大Key会占用大量Redis的内存空间,导致内存压力增大。

读写效率低:读写大Key需要的时间会更长,会影响Redis的整体响应速度。

容易引发阻塞:Redis是单线程模型,处理大Key时会阻塞其他请求。

数据传输慢:大Key在网络上的传输也会更慢,影响客户端的体验。

Redis删除大key,scan命令

(1)如何删除Redis中的大Key:

使用 DEL 命令删除大Key是非常低效的,因为它需要一次性读取整个Key的值,然后再进行删除。这种方式会导致Redis阻塞,影响其他命令的执行。

更好的删除方式是使用 UNLINK 命令。UNLINK 命令只会标记Key为待删除状态,并不会立即删除,这样可以避免阻塞问题。Redis会在后台异步删除这些Key。

(2)使用SCAN命令遍历和删除大Key:

SCAN 命令可以分批遍历Redis中的所有Key,而不会一次性读取所有Key,从而避免阻塞。

使用SCAN命令的步骤如下:

使用 SCAN 0 命令开始一个新的迭代。SCAN 命令会返回一个游标值,下次再次执行SCAN时需要带上这个游标值。

使用 SCAN <游标值> MATCH "大Key" COUNT 100 命令来遍历包含"大Key"的Key。COUNT 参数指定每次返回的Key数量。

对于遍历到的大Key,使用 UNLINK 命令进行删除。

重复步骤2-3,直到SCAN返回的游标值为0,表示遍历完成。

(3)使用管道(Pipeline)加速删除:

除了SCAN命令,您还可以使用Redis的管道(Pipeline)特性来批量删除大Key。

管道可以将多个命令打包发送到Redis,从而提高效率。您可以编写一个脚本,使用SCAN命令遍历大Key,然后将这些Key通过管道一次性删除。

Redis为什么有大key的问题,mysql没有?

Redis是基于内存的NoSQL数据库,它将整个数据集加载到内存中,所以Key和Value的大小会直接影响Redis的性能和内存占用。

而MySQL是基于磁盘的关系型数据库,它可以处理的数据量更大,因为数据不需要全部加载到内存中。

若大 Key 读取速度时间长达 60s,与此同时 Redis 还会做其他事情吗,通过什么实现这样并行的


Redis是单线程模型,当处理大Key读取时,其他请求也会被阻塞等待。不过Redis 5.0引入了多线程I/O模型,可以在某种程度上缓解这个问题。

redis有大key会发生什么(读写耗时高),如何排查大key

大Key会占用大量内存,影响Redis的性能和吞吐量。同时读写大Key也会耗费大量时间,导致Redis响应变慢。

可以使用Redis的INFO命令查看内存使用情况,或者使用OBJECT命令查看某个Key的大小。也可以使用第三方工具如redis-cli-monitor来实时监控Key的访问情况。

Redis的key和value大小有限制吗

Key 的大小限制:

Redis 的 Key 最大长度为 512MB。这意味着您可以存储最多 512MB 的 Key。

Value 的大小限制:

Redis 对 Value 的大小没有硬性上限,理论上可以存储高达 512MB 的 Value。

但在实际使用中,建议 Value 的大小不要超过 1MB,否则会影响 Redis 的性能。

Redis中打散了大key怎么查找(管道方式),除了管道还有没有其他的方式

(1)使用 KEYS 命令配合正则表达式:

如果事先知道被拆分的大Key都有一个共同的前缀,可以使用 KEYS 命令配合正则表达式来查找。

例如,如果大Key都是以 "mykey:" 为前缀,可以使用命令 KEYS "mykey:*" 来查找。

然后再通过管道或循环的方式批量删除这些Key。

(2)使用 SCAN 命令遍历:

SCAN 命令可以分批遍历Redis中的所有Key,不会一次性读取所有Key,从而避免阻塞。

可以使用 SCAN 0 开始一个新的迭代,然后使用 SCAN <游标值> MATCH "mykey:*" COUNT 100 来遍历以 "mykey:" 为前缀的Key。

对于遍历到的Key,再通过循环或管道的方式进行批量删除。

(3)结合 LUA 脚本:

还可以编写一个 LUA 脚本,在服务端执行复杂的查找和删除逻辑。

例如,使用 SCAN 命令遍历Key,并将匹配的Key通过 UNLINK 命令进行删除。这样可以进一步优化性能。

(4)使用Redis客户端库提供的工具:

一些Redis客户端库,如 Redis-py 和 Jedis,都提供了工具类来执行批量Key删除操作。

Redis大key问题,为啥慢,主要影响了什么

  • 大Key会占用更多内存,导致内存管理复杂化,增加内存碎片的风险。
  • 大Key的读写操作会阻塞Redis的主线程,影响其他命令的执行。
  • 大Key会增加网络传输的负担,导致客户端-服务器之间的通信延迟增加。
  • 大Key可能会导致 RDB 和 AOF 等持久化过程变慢,增加 Redis 的停机时间。

Redis大Key大概是多少

  • 一般认为,Redis中的大Key通常指超过 1MB 的Key-Value。
  • 1MB 以下的Key-Value通常不会对Redis性能产生很大影响。
  • 但具体多大算"大Key",需要根据您的业务场景、Redis服务器配置等因素来判断。

高ops的大val的key的解决方法

  • 对于高OPS且Value较大的Key,可以考虑以下方式优化:
  • 使用Redis的Stream数据结构,将大Value拆分成多个小块进行存储和传输。
  • 利用Redis的发布订阅机制,将大Value异步推送给订阅者,而不是直接返回给客户端。
  • 将大Value存储在外部存储系统(如对象存储),在Redis中只保留指向外部存储的引用。

   ---------------------------------------------------------------------------------------------------------------

后期新的八股文合集文章会仅粉丝可见,感兴趣的小伙伴可以点个关注~

 更多精彩内容以及一手消息请关注公众号:绝命Coding

公众号私信回复“免费资料”可免费获取简历模板以及技术亮点合集等免费资料

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

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

相关文章

2024HW面试真题(三)之看完蓝初变蓝高

以下是部分面试真题记录‍‍ 关于黑客&网络安全学习指南 学好 网络安全不论是就业还是做副业赚钱都不错&#xff0c;但要学会 网络安全 还是要有一个学习规划。最后给大家分享一份全套的 网络安全学习资料&#xff0c;给那些想学习网络安全的小伙伴们一点帮助&#xff01;…

eventbus和vuex

EventBus和Vuex EventBus 工作原理 创建一个vue实例&#xff0c;然后通过空的vue实例作为组件之间的桥梁&#xff0c;进行通信&#xff0c;利用到的设计模式有发布订阅模式 Vuex 工作原理 维护了一个state树&#xff0c;是独立的状态树&#xff0c;有明显的层级关系。不论…

振兴黄河新生力 打造文旅新地标——全国首家黄河会客厅在山东济南启幕

6月26日&#xff0c;由黄河文化发展工作站组织实施的全国首家黄河会客厅平台发布会暨山东基地启动仪式在济南成功召开。黄河会客厅以“民生黄河、生态动能、中华文明”为核心主题&#xff0c;融汇黄河智库、黄河文明、黄河产域、黄河金融、黄河科创、黄河物贸六大振兴赋能体系&…

Leetcode Hot100之矩阵

1. 矩阵置零 题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 解题思路 题目要求进行原地更改&#xff0c;也就是不能使用额外的空间&#xff0c;因此我们可以使用第一行的元素来记录对应的…

工业液晶屏G065VN01 V2规格书简介

G065VN01 V2 背面实物图 2. 概述 G065VN01 V2 专为 VGA &#xff08;640 x RGB x 480&#xff09; 分辨率和 16.2M&#xff08;RGB 6 位 FRC&#xff09;或 262k 色&#xff08;RGB 6 位&#xff09;的工业显示应用而设计。它由TFT-LCD面板、驱动IC、控制和电源电路板以及包括…

等保相关总结

等级划分准则 等保2.0基本框架 等保2.0变化解读 等级测评 3保1评 分保工作简介 分保工作流程 等保 等保工作流程&#xff1a;定级 -》备案 -》整改 -》测评 -》复核 关保 密评

C++系列-String(三)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” assign 这个接口的目的是用一个新的值代替之前的那个值 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<list> #include&l…

Python自动造波器椭圆曲线波孤子解

&#x1f3af;要点 &#x1f3af;快速傅立叶变换算法周期域解椭圆曲线波 | &#x1f3af;算法数值解孤波脉冲和结果动画 | &#x1f3af;三种语言孤子解浅水表面波方程 | &#x1f3af;渐近分解算法孤子波 | &#x1f3af;自适应步长算法孤子波 | &#x1f3af;流体自动造波器…

react学习——17react中todoList案列

1、项目目录 2、App.js //创建“外壳”组件APP import React, {Component} from "react"; //引入Header组件 import Header from "./components/Header"; //引入List组件 import List from "./components/List"; //引入Footer组件 import Foot…

【unity笔记】八、Unity人物动画介绍

一、效果预览 本内容仅介绍为unity场景中的任务添加简单的动画效果。 二、小试牛刀 2.1 插件准备 在unity 中导入人物模型。常使用的免费人物模型和动画模型有Robot Kyle&#xff0c;Unity-Chan! Model&#xff0c;Basic Motions FREE。 其中Robot Kyle仅支持URP渲染。如…

docker内apt-get update Waiting for headers 0%

问题描述 docker运行debian等容器时&#xff0c;执行apt update或者apt-get update&#xff0c;可能会出现以下错误&#xff1a;root754a91d3630a:/# apt-get update 0% [Waiting for headers] [Waiting for headers] [Connected to developer.download.nvidia.com (152.199.3…

oracle11.2.0.4 RAC 保姆级静默安装(一) GI集群软件

一、响应文件准备 我们直接使用软件解压后的response文件夹中的响应文件模板进行修改 选择当前服务器的主机名,产品目录是在已存在的/u01/app目录基础上自动创建的无需提前创建oraInventory 按需选择语言,具体语言配置参考表格 一般rac默认选择安装类型为CRS_CONFIG 对应正…

Python 基础 (标准库):collections (集合类)

1. 官方文档 collections --- 容器数据类型 — Python 3.12.4 文档 Python 的 collections 模块提供了许多有用的数据类型&#xff08;包括 OrderedDict、Counter、defaultdict、deque 和 namedtuple&#xff09;用于扩展 Python 的标准数据类型。掌握 collections 中的数据类…

一些3D数据集的简单介绍

一、Objaverse 1.0 Objaverse 1.0: a large dataset of objects with 800K (and growing) 3D models with descriptive captions, tags and animations. Assets not only belong to varied categories like animals, humans, and vehicles, but also include interiors and ex…

超越边界:探索深度学习的泛化力量

深度学习的泛化能力 一. 简介1.1 深度学习的定义1.2 什么是泛化能力1.3 深度学习模型的泛化能力1.4 提升深度学习模型的泛化能力 二. 泛化能力的重要性2.1 深度学习中泛化能力的作用2.1.1 防止过拟合2.1.2 处理噪声和不完整数据2.1.3 对于数据分布的变化具有适应性 2.2 泛化能力…

关于服务器的一些知识

1. 云服务器 和 轻量应用服务器 腾讯云中的"云服务器"&#xff08;Cloud Virtual Machine, CVM&#xff09;和"轻量应用服务器"&#xff08;Lite Cloud Server&#xff09;都是提供云端计算资源的服务&#xff0c;但它们在定位、特性和使用场景上存在一些差…

某平台小程序逆向思路整理

一、下载软件 devtools 二、强制打开控制台 根据返回的数据我们得知数据被加密了 找到这个加密的js 发现加密的位置 打断点进入这个加密的方法 之后自定义js。python调用解密即可。

计算机组成原理 | CPU子系统(3)MIPS32指令架构

MIPS32架构指令格式 MIPS32架构寻址方式 指令的编码与功能

第 27 篇 : 搭建maven私服nexus

官网文档 1. 下载应该很慢, 最好是能翻墙 nexus-3.69.0-02-java8-unix.tar.gz 2. 上传到/usr/local/src, 解压及重命名 tar -zxvf nexus-3.69.0-02-java8-unix.tar.gz rm -rf nexus-3.69.0-02-java8-unix.tar.gz mv nexus-3.69.0-02 nexus ls3. 修改配置 cd /usr/local/sr…

AI-智能体基础设施

个性化记忆需要世界模型来协助构建 业界有一个精简的Agent表达公示&#xff0c;即&#xff1a;Agent大模型&#xff08;LLM&#xff09;记忆&#xff08;Memory&#xff09;主动规划&#xff08;Planning&#xff09;工具使用&#xff08;Tool Use&#xff09;。基于该公式&am…