【Redis】BigKey问题
面试题
海量数据里查询某一固定前缀的key
生产上如何限制 keys * / flushdb / flushall 等危险命令以防止误删误用?
MEMORY USAGE 命令用过吗?
BigKey问题,多大算big?如何发现?如何删除?如何处理?
BigKey你做过调优吗?惰性释放lazyfree了解过吗?
MoreKey问题,生产上Redis数据库有1000万条记录,如何遍历?
MoreKey案例
大批量往Redis中插入100万条测试数据
# 生成100W条redis批量设置kv的语句(key=kn,value=vn)写入到/tmp目录下的redisTest.txt文件中
for((i=1;i<=100*10000;i++)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;
试试keys * 遍历查询花费多少秒?试试就逝世,足足花费了二十几秒!
生产上如何限制 keys * / flushdb / flushall 等危险命令以防止误删误用?
通过redis.conf配置文件设置禁用
不用keys * 应该用什么?SCAN
详情见官方文档:Redis SCAN 命令 递增地遍历key空间
SCAN cursor [MATCH pattern] [COUNT count]
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10 。
什么是 Redis 增量遍历?SCAN 命令是一个基于游标的遍历器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次遍历时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的遍历过程。
SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次遍历的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被遍历的元素。当 SCAN 命令的游标参数被设置为 0
时, 服务器将开始一次新的遍历,而当服务器向用户返回值为 0
的游标时, 表示遍历已结束。
SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。
非常特别,它不是从第一维数组的第零位一直遍历到末尾,而是采用了高位进位加法来遍历。之所以使用这样特殊的方式进行遍历,是考虑到字典的扩容和缩容时避免槽位的遍历重复和遗漏。
虽然 SCAN 命令不保证每次遍历所返回的元素数量, 但我们可以使用 COUNT 选项, 对命令的行为进行一定程度上的调整。 COUNT 选项的作用就是让用户告知遍历命令, 在每次遍历中应该从数据集里返回多少元素。虽然这个选项只是对增量式遍历命令的一种提示, 但是在大多数情况下, 这种提示都是有效的。
SCAN 返回一个包含两个元素的数组:
第一个元素是用于进行下一次迭代的新游标, 第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回零表示迭代已结束。
SCAN的遍历顺序
BigKey案例
多大算big
参考《阿里云Redisson开发规范》
string和二级结构
string是value,最大512MB,但是 ≥ 10KB 就是BigKey
list、hash、set、zset,个数超过5000就是BigKey(by the way,它们都可以存储超过40亿个元素)
危害
内存不均,集群迁移困难
大key导致超时删除
网络流量阻塞
如何产生
社交类:王心凌粉丝列表,典型案例粉丝逐步递增
汇总统计:某个报表,年月日经年累月的积累
如何发现
redis-cli --bigkeys
优点:给出每种数据结构Top 1 bigkey,同时给出每种数据类型的键值个数+平均大小
不足:想查询大于10kb的所有key,--bigkeys参数就无能为力了,需要用到memory usage
来计算每个键值的字节数
redis-cli -h 127.0.0.1 -p 6379 -a 111111 --bigkeys
# 每隔 100 条 scan 指令就会休眠 0.1s,ops 就不会剧烈抬升,但是扫描的时间会变长
redis-cli -h 127.0.0.1 -p 7001 –-bigkeys -i 0.1
MEMORY USAGE key MEMORY USAGE key [SAMPLES count]
详情见官网:Redis MEMORY USAGE 命令 估计key的内存使用情况
MEMORY USAGE 命令给出一个 key
和它的值在 RAM 中所占用的字节数。
返回的结果是 key
的值以及为管理该 key
分配的内存总字节数。
对于嵌套数据类型,可以使用选项 SAMPLES
,其中 count
表示抽样的元素个数,默认值为 5 。当需要抽样所有元素时,使用 SAMPLES 0
。
如何删除
参考《阿里云Redisson开发规范》
String
一般用del,过于庞大用unlink;
hash
使用hscan每次获取少量field-value,再使用hdel删除每个field。
命令:
阿里手册:
list
命令
阿里手册:
set
使用sscan每次获取部分元素,再使用srem命令删除每个元素
命令
阿里手册
zset
使用zscan
每次获取部分元素,再使用 ZREMRANGEBYRANK
命令删除每个元素
命令
阿里手册
BigKey生产调优
redis.conf 配置文件 LAZY FREEING 相关说明
阻塞和非阻塞删除命令
优化配置
【Redis】BigKey问题的更多相关文章
- 如何快速排查发现redis的bigkey?4种方案一次性给到你!
本篇文章将以redis的bigkey为主题进行技术展开,通过从认识redis的高性能,bigkey的危害.存在原因.4种解决方案,到模拟实战演练的介绍方式,来跟大家一起认识.探讨和学习redis. 先 ...
- Redis监控调研
1 调研目的 主要的目的是想调研各大云平台有关Redis监控功能的实现,但是最后我发现各大云平台提供的监控功能都比较基础,比如我想看诸如访问频率较高的HotKey.占用内存较大的Bigkey等指标,它 ...
- 1.5万字总结 Redis 常见面试题&知识点
以下内容来源于于我开源的 JavaGuide (Java学习&&面试指南,Github 130k star,370人共同参与爱完善), 万字总结,质量有保障! 这篇文章最早写于2019 ...
- redis的bigkey扫描脚本
众所周知,redis里面的大key存在是非常危险的一件事情.因为最近的工作转移到中间件相关的工作,因此关注了一下bigkey的扫描方法.首先介绍一下阿里云提供的扫描脚本: 具体可见:https://y ...
- Redis(十二)flush误操作、Redis安全、处理bigkey和寻找热点key
一.flushall/flushdb误操作的处理 假设进行flush操作的Redis是一对主从结构的主节点,其中键值对的个数是100万,每秒写入量是1000. 1.缓存与存储 被误操作flush后,根 ...
- Redis获得bigkey扫描脚本
众所周知,redis里面的大key存在是非常危险的一件事情.因为最近的工作转移到中间件相关的工作,因此关注了一下bigkey的扫描方法.首先介绍一下阿里云提供的扫描脚本:具体可见:https://yq ...
- 第三节:Redis缓存雪崩、击穿、穿透、双写一致性、并发竞争、热点key重建优化、BigKey的优化 等解决方案
一. 缓存雪崩 1. 含义 同一时刻,大量的缓存同时过期失效. 2. 产生原因和后果 (1). 原因:由于开发人员经验不足或失误,大量热点缓存设置了统一的过期时间. (2). 产生后果:恰逢秒杀高峰, ...
- redis集群讨论
一.生产应用场景 二.存储架构演变 三.应用最佳实践 四.运维经验总结 第1.2节:介绍redis cluster在唯品会的生产应用场景,以及存储架构的演变.第3节:redis cluster的稳定性 ...
- 一份完整的阿里云 Redis 开发规范,值得收藏!
来源:yq.aliyun.com/articles/531067 作者:付磊-起扬 本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使用 相关工具 通 ...
- 阿里云Redis开发规范
转自: https://yq.aliyun.com/articles/531067 摘要: 本文介绍了在使用阿里云Redis的开发规范,从键值设计.命令使用.客户端使用.相关工具等方面进行说明,通过本 ...
随机推荐
- 当你用neovim的mason插件管理lsp config,并且配置好bash的bashls后,却没有正常工作的解决方式
刚开始遇到这个情况我百思不得其解,检查了neovim checkhealth,以为是npm包管理的问题,然后删了下删了下 不但没有解决还把包管理整乱了-- 后来发现是我没仔细看bash-languag ...
- DashVector x 通义千问大模型:打造基于专属知识的问答服务
本教程演示如何使用向量检索服务(DashVector),结合LLM大模型等能力,来打造基于垂直领域专属知识等问答服务.其中LLM大模型能力,以及文本向量生成等能力,这里基于灵积模型服务上的通义千问 A ...
- Chart.js (v2.9.4)概要介绍
chart.js是一个非常优秀的开源图表插件,扩展非常灵活,同时也提供了大量的钩子函数,给与用户添加自定义插件,实现个性化的需求. 具体的优势特点,这里不详述,网上大把资料,现开始正式深入了解这个插件 ...
- Java静态变量在静态方法内部无法改变值
一.如何解决"Java静态变量在静态方法内部无法改变值"的问题 在Java中,静态变量(也称为类变量)属于类本身,而不是类的任何特定实例.它们可以在没有创建类的实例的情况下访问和修 ...
- SDL入门
本篇主要用于记录SDL2.0.22的基本用法,参考别人的代码,并加了注释方便理解这些api 以下两个demo可以在VS中编译并运行,代码参考 SDL视频显示_奋斗吧!骚年!的博客-CSDN博客 1.S ...
- 霍夫变换原理及实现(Opencv C++)
已知一幅图像中的n个点,假设我们希望找到这些点中位于直线上的子集.一种可能的解决方法是,首先找到由每对点确定的所有直线,然后寻找靠近特定直线的那些点的所有子集.这种方法涉及寻找n(n-1)/2~n2条 ...
- docker构建镜像——Dockerfile
from RUN CMD EXPOSE LABEL ENV COPY 格式 COPY [--chown=<用户>:<组>]<源>...<目的> COPY ...
- 【Java】JVM字节码分析
一.功能 1.工作原理 2.解释和运行 jvm本质上是运行在计算机上的程序,负责运行java字节码文件 对字节码文件中的指令,实时的解释成机器码,供计算机执行 3.内存管理 自动为对象.方法等分配内存 ...
- Github Markdown 指定图片在光亮或暗黑模式展示
Github 根据系统配置不同的主题模式: 如果想要在光亮模式和暗黑模式显示不同的主题的图片,比如以下就是同一个图片在暗黑模式和光亮模式下展示: 解决方案 在markdon 的图片链接后添加#gh-d ...
- Vulkan的VkImage和OpenGL的Texture2D互转的3种方法
Vulkan的纹理和OpenGL的纹理之间共享的解决方案, 因为项目的功能需要同时引入OpenGL和Vulkan,又因为效率的影响必须想办法优化,两者之间需要互相访问互相转换的高效方案. Vulkan ...