阿里三面:Redis大key怎么处理?

阿里三面:Redis大key怎么处理?

一、什么是大key?

首先大key不是key很大而是key对应的value值很大,一般而言如果String类型值大于10KB,Hash,Set,Zset,List类型的元素的个数大于5000个都可以称之为大key。

本文已收录到Java面试网站

二、大key的危害

  • 客户端超时等待:由于Redis执行命令是单线程处理,然后在操作大key时会比较耗时,那么就会阻塞Redis,从客户端这一视角来看就是很久很久都没有响应
  • 引发网络阻塞:每次获取大key产生的流量较大,如果一个key的大小是1MB,每秒访问量为1000,那么每秒会产生1000MB的流量这对于普通千兆网卡是灾难的
  • 阻塞工作线程:如果使用del删除大key,会阻塞工作线程这样就没有办法处理后续的命令
  • 内存分布不均匀:集群模型在slot分片均匀的情况下,会出现数据和查询倾斜情况,部分有大key的Redis节点占用内存多,QPS比较大

三、定位大key

1、redi-cli --bigkeys

使用时注意事项:最好在从节点上执行该命令或者在Redis实例业务压力的低峰阶段进行扫描查询,因为key很多时会很慢

不足之处

  • 这个方法只能返回每种类型中最大的那个bigkey,无法得到大小排到前N位的bigkey
  • 对于集合类型来说,这个方法只统计集合元素的多少,而不是实际占用的内存量。因为一个集合中元素个数多,并不一定占用内存就多

2.使用SCAN命令查找大key

  • 使用SCAN命令对数据库进行扫描。然后用TYPE命令获取返回的每一个key的类型
  • 对于String类型,可以直接使用STRLEN命令获取字符串长度,也就是占用的内存空间字节数
  • 对于集合类型来说可以使用MEMORY USAGE命令,查询有关键值对占用的内存空间基于redis的keys、scan删除ttl为-1的key

3.使用RdbTools

使用第三方开源工具,可以解析Redis快照,找到其中的大key

四、删除大key

1.分批次删除

使用SCAN扫描key,比如删除Hash,先取100字段删除删除再取

2.异步删除

在Redis4.0版本开始,可以采用异步删除法用unlink命令代替del删除

这样Redis会将这个key放入到一个异步线程中进行删除,这样不会阻塞主线程

3.被动删除

前面两种都是主动删除,这一种是通过配置参数,当认为需要删除的时候就删除了

  1. lazyfree-lazy-eviction:表示当 Redis 运行内存超过 maxmeory 时,是否开启 lazy free 机制删除;
  2. azyfree-lazy-expire:表示设置了过期时间的键值,当过期之后是否开启 lazy free 机制删除;
  3. lazyfree-lazy-server-del:有些指令在处理已存在的键时,会带有一个隐式的 del 键的操作,比如 rename 命令,当目标键已存在,Redis 会先删除目标键,如果这些目标键是一个 big key,就会造成阻塞删除的问题,此配置表示在这种场景中是否开启 lazy free 机制删除;
  4. slave-lazy-flush:针对 slave (从节点) 进行全量数据同步,slave 在加载 master 的 RDB 文件前,会运行 flushall 来清理自己的数据,它表示此时是否开启 lazy free 机制删除。

建议开启其中的 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-server-del 等配置,这样就可以有效的提高主线程的执行效率

五、如何避免大key

1.对大key进行拆分

将一个Big Key拆分为多个key-value这样的小Key,并确保每个key的成员数量或者大小在合理范围内,然后再进行存储,通过get不同的key或者使用mget批量获取。

2.对大key进行清理

对Redis中的大Key进行清理,从Redis中删除此类数据。Redis自4.0起提供了UNLINK命令,该命令能够以非阻塞的方式缓慢逐步的清理传入的Key,通过UNLINK,你可以安全的删除大Key甚至特大Key

3.监控Redis内存、网络带宽、超时等指标

通过监控系统并设置合理的Redis内存报警阈值来提醒我们此时可能有大Key正在产生,如:Redis内存使用率超过70%,Redis内存1小时内增长率超过20%等。

4.压缩value

使用序列化、压缩算法将key的大小控制在合理范围内,但是需要注意序列化、反序列化都会带来一定的消耗。如果压缩后,value还是很大,那么可以进一步对key进行拆分。

最后分享一份我精心整理的大厂面试手册,包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等高频面试题,非常实用,有小伙伴靠着这份手册拿过字节offer~

需要的小伙伴可以自行下载

链接:http://mp.weixin.qq.com/s?__biz=Mzg2OTY1NzY0MQ==&mid=2247485445&idx=1&sn=1c6e224b9bb3da457f5ee03894493dbc&chksm=ce98f543f9ef7c55325e3bf336607a370935a6c78dbb68cf86e59f5d68f4c51d175365a189f8#rd

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

18. 《C语言》——【Nice2016年校招笔试题引发的思考】

亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能,成为一名优…

中国版Sora?快手「可灵」到底行不行?

“可灵”与Sora有相似的技术架构,生成的视频动作流畅、幅度大,对物理世界理解力与还原度很高。可生成120秒、每秒30帧的高清视频,分辨率高达1080p,并且支持多种不同的屏幕比例。 “中国版SORA”到底是不是名副其实?能…

谷歌浏览器124版本Webdriver驱动下载

查看谷歌浏览器版本 在浏览器的地址栏输入: chrome://version/回车后即可查看到对应版本(不要点击帮助-关于Google chrome,因为点击后会自动更新谷歌版本) 114之前版本:下载链接 ​​​​​​123以后版本:下载链接&#xff0…

【机器学习】通用大模型VS垂直大模型,你更加青睐哪一方?

目录 前言AI大模型的战场:通用与垂直的分化通用大模型:广泛适用的利器垂直大模型:深入领域的利器谁能够形成绝对优势?结语通用大模型文章推荐 前言 AI大模型的战场正在分化: 通用大模型在落地场景更广泛毋庸置疑&…

idea插件开发之实现设置信息持久化存储

写在前面 在idea中设置的信息,我们重启idea后,这些信息还是在的,这其实是通过idea插件的持久化存储功能实现的,本文一起来看下如何实现。 1:正戏 为了方便测试,首先定义如下的ui: 我们需要在代码中给按…

干货分享:宏集物联网HMI通过S7 MPI协议采集西门子400PLC数据

前言 为了实现和西门子PLC的数据交互,宏集物联网HMI集成了S7 PPI、S7 MPI、S7 Optimized、S7 ETH等多个驱动来适配西门子200、300、400、1200、1500、LOGO等系列PLC。 本文主要介绍宏集HMI通过S7 MPI协议采集西门子400PLC数据的操作步骤,其他协议的操作…

C++入门 string的模拟实现

目录 再谈swap string常见接口模拟实现 构造函数 & 析构函数 拷贝构造 & 赋值运算符重载 begin迭代器 & end迭代器 size & swap & clear & c_str operator[ ] & reserve push_back & append operator & find insert & erase…

计算机网络之网络层知识总结

网络层功能概述 主要任务 主要任务是把分组从源端传到目的端,为分组交换网上的不同主机提供通信服务。网络层传输单位是数据报。 分组和数据报的关系:把数据报进行切割之后,就是分组。 主要功能: 路由选择与分组转发 路由器…

openh264 编码器源码分析:WelsCodeOneSlice 函数

介绍 功能:openh264 编码每个 slice 的核心函数原型: int32_t WelsCodeOneSlice (sWelsEncCtx* pEncCtx, SSlice* pCurSlice, const int32_t kiNalType)参数: pEncCtx:指向编码上下文结构体sWelsEncCtx的指针,包含编…

gpt、llama大模型模型结构细节探索

参考: https://github.com/naklecha/llama3-from-scratch(一定要看看) https://github.com/karpathy/build-nanogpt/blob/master/play.ipynb 视频: https://www.youtube.com/watch?vl8pRSuU81PU https://tiktokenizer.vercel…

Vitis HLS 学习笔记--移除内存分配malloc

目录 1. 简介 2. 示例解析 2.1 源码解释 2.2 malloc 分析 2.3 替代方案分析 3. 总结 1. 简介 Vitis HLS 也不支持动态创建或删除 C/C 对象(用于综合)。 本文探究如何在C/C代码中避免使用显式的malloc函数来分配内存。在硬件设计和FPGA开发中&…

b站视频下载到电脑本地mp4格式,b站视频下载到手机相册

有时候我们想把网站上的视频下载到电脑或手机,其实有多种方法可供选择。本文将详细介绍几种常见的下载方式,并探讨它们的优缺点,帮助读者根据自己的需求选择最适合的下载方法。 方法一: 1、使用 "小白兔视频格式在线转换网站…

LogicFlow 学习笔记——3. LogicFlow 基础 节点 Node

节点 Node LogicFlow 内置了一些基础节点,开发者在实际应用场景中,可以基于这些基础节点,定义符合自己业务逻辑的节点。 认识基础节点 LogicFlow是基于svg做的流程图编辑框架,所以我们的节点和连线都是svg基本形状,…

中电联系列四:rocket手把手教你理解中电联协议!

分享《慧哥的充电桩开源SAAS系统,支持汽车充电桩、二轮自行车充电桩。》 电动汽车充换电服务信息交换 第4部分:数据传输与安全 Interactive of charging and battery swap service information for electric vehicle Part 4:Data transmission and secu…

nosql数据库的特点

NoSQL简介 NoSQL是一种不同于关系数据库的数据库管理系统设计方式,是对非关系型数据库的统称,它所采用的数据模型并非传统关系数据库的关系模型,而是类似键/值、列族、文档等非关系模型。NoSQL数据库没有固定的表结构,通常也不存在连接操作,也没有严格遵守ACID约束。因此…

Redis高性能原理:Redis为什么这么快?

目录 前言: 一、Redis知识系统观 二、Redis为什么这么快? 三、Redis 唯快不破的原理总结 四、Redis6.x的多线程 前言: Redis 为了高性能,从各方各面都进行了优化。学习一门技术,通常只接触了零散的技术点&#xff…

用ChatGPT 4o画漂亮的燃尽图代码

把代码给ChatGPT,然后他就会帮我生成出来了。 而且图是动态的,可以调整颜色文字之类的内容 # Given data for Sprint 5 Progress data_sprint_5 {User Story: [BEAN-40, BEAN-42, BEAN-41, BEAN-22, BEAN-33, BEAN-44, BEAN-10, BEAN-26, BEAN-37, BEA…

【学术小白成长之路】03三方演化博弈(基于复制动态方程)均衡点与稳定性分析

从本专栏开始,笔者正式研究演化博弈分析,其中涉及到双方演化博弈分析,三方演化博弈分析,复杂网络博弈分析等等。 先阅读了大量相关的博弈分析的文献,总结了现有的研究常用的研究流程,针对每个流程进行拆解。…

Sqlite3入门和c/c++下使用

1. SQLite3基本介绍 1.1 数据库的数据类型 1.2 基本语法 1. 创建数据表格 create table 表名(字段名 数据类型, 字段名 数据类型); create table student(id int, name varchar(256), address text, QQ char(32)); 2. 插入数据 insert into 表名 valu…

手机流畅运行470亿参数大模型,上交大发布PowerInfer-2推理框架,性能提升29倍

苹果一出手,在手机等移动设备上部署大模型迅速成为行业焦点。 目前,移动设备上运行的模型相对较小(苹果的是3B,谷歌的是2B),并且消耗大量内存,这在很大程度上限制了其应用场景。 即使是苹果&…