Redis中BigKey与MoreKey优化笔记

1.MoreKey

在Redis中,MoreKey问题通常指的是当数据库中的key数量非常多时,使用如KEYS *这样的命令去检索所有的key,这会导致Redis服务阻塞,影响正常业务。因为Redis是单线程操作的,执行这类命令时会占用大量时间,从而阻塞其他操作。

keys * 这个指令有致命的弊端,在实际环境中最好不要使用

这个指令没有offset、limit 参数,是要一次性吐出所有满足条件的key,由于redis是单线程的,其所有操作都是原子的,而keys算法是遍历算法,复杂度是O(n),如果实例中有千万级以上的 key,这个指令就会导致Redis服务卡顿所有读写Redis 的其它的指令都会被延后甚至会超时报错,可能会引起缓存雪崩甚至数据库宕机。

生产上限制 keys * /flushdb/flushall等危险命令以防止误删误用?

通过配置文件设置禁用这些命令,redis.conf在SECURITY这一项中

为了避免MoreKey问题,Redis提供了SCAN命令,它是一个基于游标的迭代器,用于以增量的方式迭代数据库中的key。SCAN命令不会像KEYS *那样一次性返回所有的key,而是返回一个游标和一批key,用户可以使用返回的游标进行下一次迭代,直到游标返回0,表示迭代结束。这种方式可以避免阻塞Redis服务,并且可以自定义每次迭代返回的key数量,减少一次性返回大量key对性能的影响。

Scan命令用于迭代数据库中的数据库键

SCAN命令是一个基于游标的迭代器,每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为SCAN命令的游标参数,以此来延续之前的迭代过程。

SCAN返回一个包含两个元素的数组

1). 第一个元素是用于进行下一次迭代的新游标

2). 第二个元素则是一个数组,这个数组中包含了所有被迭代的元素 如果新游标返回零表示迭代已结束

SCAN的遍历顺序

非常特别,它不是从第一维数组的第零位一直遍历到末尾,而是采用了高位进位加法来遍历。之所以使用这样特殊的方式进行遍历,是考虑到字典的扩容和缩容时避免槽位的遍历重复和遗漏

在实际使用中,应该避免使用KEYS *这样的命令,而是采用SCAN及其相关的迭代命令来处理大量key的情况。这样可以有效地避免Redis服务因处理大量key而造成的阻塞,确保Redis的性能和稳定性

2.BigKey

Redis中的BigKey指的是那些值(value)特别大的键(key),这可能包括大的字符串或者包含大量元素的集合类型(如list、set、hash、zset等)。BigKey的存在可能会导致Redis的性能问题,因为Redis是单线程操作的,处理BigKey时可能会阻塞其他操作,影响整体性能。

通常我们说的BigKey,不是在值的Key很大,而是指的Key对应的value很大

string和二级结构

  • string是value,最大512MB 但是≥10KB就是bigkey

  • list、hash、set和zset,value个数超过5000就是bigkey

    list:一个列表最多可以包含2^32-1个元素(4294967295,每个列表超过40亿个元素)。

    hash:Redis中每个hash可以存储2^32-1个键值对(40多亿)

    set:集合中最大的成员数为2^32-1(4294967295,每个集合可存储40多亿个成员)

3.Bigkey危害、产生与发现

3.1 危害

  • 内存使用不均:在集群模式下可能导致某些节点内存使用过高。
  • 请求阻塞:操作BigKey可能耗时较长,阻塞其他请求。
  • 网络拥塞:BigKey可能会占用大量带宽,影响其他服务。
  • 删除时阻塞:删除操作可能会阻塞Redis,尤其是在BigKey设置了过期时间后

3.2 产生

  • 社交类 明星粉丝列表,典型案例粉丝逐步递增,热点事件

  • 汇总统计 某个报表,日月年经年累计

3.3 发现

redis-cli --bigkey命令:给出每种数据结构Top 1 bigkey。同时给出每种数据类型的键值个数+平均大小

缺点:想查询大于10kb的所有key,--bigkeys参数就无能为力了,需要用到memory usage来计算每个键值的字节数

redis-cli --bigkeys -a 111111
redis-cli -h 127.0.0.1 -p 6379 -a 111111 --bigkeys#加上 -i 参数,每隔100 条 scan指令就会休眠0.1s.ops就不会剧烈抬升,但是扫描的时间会变长
redis-cli -h 127.0.0.1 -p 7001 --bigkeys -i 0.1

计算每个键值的字节数

memory usage key

4. 大key如何删除

普通命令

  • String: 一般用del,如果过于庞大使用unlink key 删除

  • hash: 使用hscan每次获取少量field-value,再使用hdel删除每个field

  • list: 使用ltrim渐进式逐步删除,直到全部删除完成

  • set: 使用sscan每次获取部分元素,在使用srem命令删除每个元素

  • zset:使用zscan每次获取部分元素,在使用zremrangebyrank命令删除每个元素

5. BigKey生产调优

  • 分割BigKey:将一个大的key分割成多个小的key,例如将一个大的hash分割成多个小的hash。

  • 清理BigKey:对于不再需要的BigKey,可以直接删除。在Redis 4.0及以上版本,可以使用UNLINK命令异步删除key,避免阻塞。
  • 监控内存:设置内存使用率的监控阈值,提前发现潜在的BigKey问题。
  • 定期清理失效数据:对于存储大量数据的key,定期清理过期或无效数据。
  • 使用合适的数据结构:避免不必要的复杂数据结构,或者使用更高效的数据结构来减少内存占用

redis.conf配置文件 LAZY FREEING相关说明

阻塞和非阻塞删除命令

优化配置

lazyfree-lazy-eviction:当 redis 内存达到阈值 maxmemory 时,将执行内存淘汰
lazyfree-lazy-expire:当设置了过期 key 的过期时间到了,将删除 key
lazyfree-lazy-server-del:这种主要用户提交 del 删除指令
replica-lazy-flush:主要用于复制过程中,全量同步的场景,从节点需要删除整个 db
lazyfree-lazy-user-del:修改del命令的默认行为,使之与unlink命令一样

在处理BigKey时,应该尽量避免在主节点上进行大规模的扫描或删除操作,以免影响线上服务。可以考虑在从节点上进行这些操作,或者在业务低峰期进行。

6.最后

谢谢大家,请大家多多支持!

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

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

相关文章

Arthas redefine(加载外部的.class文件,redefine到JVM里 )

文章目录 二、命令列表2.2 class/classloader相关命令2.2.3 redefine(加载外部的.class文件,redefine到JVM里 )举例1:加载新的代码,jad/mc 命令使用举例2:上传 .class 文件到服务器的技巧 二、命令列表 2.…

柯桥韩语学校|韩语每日一词打卡:회갑연[회가변]【名词】花甲宴

今日一词:회갑연 韩语每日一词打卡:회갑연[회가변]【名词】花甲宴 原文:인구 노령화에 따라서 요즘 회갑연보다는 고희연을 더 많이 지냅니다. 意思:随着人口老龄化,最近比起花甲宴,更多人办古稀宴。 【原文分解】 1、인구[인구]…

【BurpSuite】访问控制漏洞和权限提升 | Access control vulnerabilities (3-6)

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍收藏💗支持一下哦 【BurpSuite】访问控制漏洞和权限提升 | Access control vulnerabilities (3-6) 实验三 Lab: User role controlled b…

【IoT-NTN】系统消息SIB31信令分析

3GPP卫星通信发展迅速, TS36.331 R17中新增SIB31携带星历信息,本文对SIB31的信令内容进行了分析。 SystemInformationBlockType31 分析报告 一、概述 本文档详细描述了SystemInformationBlockType31(简称SIB31)的结构和内容&am…

[Redis][集群][上]详细讲解

目录 0.前言1.基本概念2.数据分片算法0.前言1.哈希求余2.一致性哈希算法3.哈希槽分区算法(Redis使用) 0.前言 说明:该章节相关操作不需要记忆,理解流程和原理即可,用的时候能自主查到即可 1.基本概念 哨兵模式提高了系统的可用性&#xff0…

试用Debian12.7和Ubuntu24.4小札

Debian GNU/Linux 12 (bookworm)和Ubuntu 24.04.1 LTS是现阶段(2024年9月26日)两个发行版的最新版本。Ubuntu Server版本默认就不带桌面(ubuntu-24.04-live-server-amd64.iso),这个默认就是最小化安装(安装…

Moshi: a speech-text foundation model for real time dialogue

视频号 挺神奇的东西 整下来 kyutai-labs/moshi (github.com) git clone https://github.com/kyutai-labs/moshi.git 在线体验 moshi.chat 结束后 点击Download audio Download video 可以下载音频与视频 (不过是webm格式) 发行版 已上传至资源 小…

springboot+大数据基于数据挖掘的招聘信息可视化大屏系统【内含源码+文档+部署教程】

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

【C++】 vector 迭代器失效问题

【C】 vector 迭代器失效问题 一. 迭代器失效问题分析二. 对于vector可能会导致其迭代器失效的操作有:1. 会引起其底层空间改变的操作,都有可能是迭代器失效2. 指定位置元素的删除操作--erase3. Linux下,g编译器对迭代器失效的检测并不是非常…

数论——数数(找质因数个数),三位出题人(组合数学,快速幂)

数数&#xff08;找质因数个数&#xff09; 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码&#xff08;通过率一半&#xff09; #include <iostream> #include <vector> using namespace std; const int N5e66; int n; vector<bool>vis; vo…

vmware-toolbox安装,VMware虚拟机访问win10共享目录

问题&#xff1a;VMware界面无法安装vmware-toolbox&#xff0c;共享目录设置失败 解决方法&#xff1a; VMware设置 共享文件夹 ubuntu24 vm中运行vmware-toolbox-cmd -v 检查版本 vm运行sudo apt install open-vm-tools // vm可能需要重启 vm的 /mnt 目录下如果没有 hgfs…

骨传导耳机哪个牌子好?年度五大热门骨传导耳机推荐清单来了!

近年来&#xff0c;骨传导耳机以其独特的传音方式和开放耳道的设计&#xff0c;逐渐成为运动爱好者和追求健康生活方式人群的新宠。与传统耳机相比&#xff0c;骨传导耳机不仅能够保护听力&#xff0c;还能在享受音乐的同时保持对周围环境的警觉。 随着骨传导耳机市场的不断壮…

1.MySQL的安装

目录 下载安装包 安装前环境的准备 正式安装 下载安装包 MySQL安装网址:https://www.mysql.com/cn/ 进去之后就是上面这个页面&#xff0c;进行汉化的时候将这个网页拉至最下&#xff0c;右下角点成中文就可以&#xff0c;如下这个页面。 回到页面顶端&#xff0c;点击下载&a…

并发编程---线程与进程

业务场景&#xff1a;小明去理发店理发。 小明去理发店理发&#xff0c;完成理发需要吹&#xff0c;剪&#xff0c;洗、理的过程。由这个场景我们引用进程和线程这两个 概念。 一.进程 1.什么是进程 进程是具有独立功能的程序关于某个数据集合上的一次运行活动&#xff0c;是…

基于Hadoop的NBA球员大数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

MySQL InnoDB MVCC数据结构分析

1、概述 MVCC&#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制&#xff0c;通过维护不同的版本号&#xff0c;提供一种很好的并发控制技术&#xff0c;这种技术能够使读写操作不冲突&#xff0c;提升并发性能。 MySQL InnoDB存储引擎&#xff0c;在更…

Colorful/七彩虹将星X17 XS 22 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能&#xff0c;自动重建COLORFUL RECOVERY功能&#xff0c;恢复到新机开箱状态。 【格式】&#xff1a;iso 【系统类型】&#xff1a;Windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 注意&#xff1a;安装系统会…

设计模式、系统设计 record part02

软件设计模式&#xff1a; 1.应对重复发生的问题 2.解决方案 3.可以反复使用 1.本质是面向对象 2.优点很多 1.创建型-创建和使用分离 2.结构型-组合 3.行为型-协作 571123种模式 UML-统一建模语言-Unified Modeling Language 1.可视化&#xff0c;图形化 2.各种图&#xff08;9…

服务器操作系统【sar 命令】

sar 安装、语法参数说明以及示例 文章目录 功能概述一、功能介绍1.安装配置2. 配置3. 启动二、sar 语法及参数说明三、示例及释义1.汇报 io 传输速率信息2.内存分页信息3.块设备状态信息4.hugepages 利用率统计信息5.列长度和负载平均值6.内存利用率统计信息7.swap 交换空间利用…

ARM点灯---看手册

知识点&#xff1a; 一个程序可能会遇到内存泄漏问题&#xff0c;可能一次运行泄漏几M大小&#xff0c;执行几个小时才会泄漏到站崩溃&#xff0c;所以要查看是否有内存泄漏。 查看手册教程 0927-上午 视频1&#xff1a;25&#xff1b;00 硬件程序开发流程 最小系统:单片…