论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
数据库
›
Nosql
›
【Redis】BigKey问题
【Redis】BigKey问题
半亩花草
金牌会员
|
2024-3-3 12:42:30
|
显示全部楼层
|
阅读模式
楼主
主题
853
|
帖子
853
|
积分
2559
面试题
海量数据里查询某一固定前缀的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文件中<br>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<br><br># 每隔 100 条 scan 指令就会休眠 0.1s,ops 就不会剧烈抬升,但是扫描的时间会变长<br><br>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 相关说明
阻塞和非阻塞删除命令
优化配置
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
半亩花草
金牌会员
这个人很懒什么都没写!
楼主热帖
本周涨粉一倍,我决定再开源一个商超管 ...
YOLOV5 代码复现以及搭载服务器运行 ...
安装Python
.net6下[WPF+yolov5+opencvsharp]
《C++性能优化指南》 linux版代码及原 ...
经典Python题目:一个列表或者数组去重 ...
Spring Boot 宣布移除 run 命令,真让 ...
go-zero插件goctl-swagger的坑
APP性能优化
Java集合框架(五)-Collections 和 泛型 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表