【Redis】BigKey问题

这篇具有很好参考价值的文章主要介绍了【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配置文件设置禁用

【Redis】BigKey问题

不用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的遍历顺序

 

【Redis】BigKey问题

BigKey案例

多大算big

参考《阿里云Redisson开发规范》

【Redis】BigKey问题

string和二级结构

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

list、hash、set、zset,个数超过5000就是BigKey(by the way,它们都可以存储超过40亿个元素)

危害

  1. 内存不均,集群迁移困难

  2. 大key导致超时删除

  3. 网络流量阻塞

如何产生

社交类:王心凌粉丝列表,典型案例粉丝逐步递增

汇总统计:某个报表,年月日经年累月的积累

如何发现

redis-cli --bigkeys

优点:给出每种数据结构Top 1 bigkey,同时给出每种数据类型的键值个数+平均大小

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

【Redis】BigKey问题

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

【Redis】BigKey问题

如何删除

参考《阿里云Redisson开发规范》

【Redis】BigKey问题

String

一般用del,过于庞大用unlink;

 

hash

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

命令:

【Redis】BigKey问题

阿里手册:

【Redis】BigKey问题

 

list

命令

【Redis】BigKey问题

【Redis】BigKey问题

阿里手册:

【Redis】BigKey问题

 

set

使用sscan每次获取部分元素,再使用srem命令删除每个元素

命令

【Redis】BigKey问题

阿里手册

【Redis】BigKey问题

 

zset

使用zscan每次获取部分元素,再使用 ZREMRANGEBYRANK 命令删除每个元素

命令

【Redis】BigKey问题

【Redis】BigKey问题

阿里手册

【Redis】BigKey问题

 

BigKey生产调优

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

阻塞和非阻塞删除命令

【Redis】BigKey问题

优化配置

【Redis】BigKey问题文章来源地址https://www.toymoban.com/news/detail-760499.html

 

到了这里,关于【Redis】BigKey问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis的MoreKey和BigKey问题

    大批量往Redis里面插入200w测试数据key 在Linux Bash下面执行,插入200w数据 使用命令 tail -10 redisTest.txt 查看最后10行记录 通过redis提供的管道 --pipe命令插入200W大批量数据 time用于查看耗时多长 可以看出插入200w条数据,耗时才不到6秒,还是非常快的 尝试使用 keys * ,查看所有的

    2023年04月19日
    浏览(37)
  • 商城项目-es的海量查询/聚合/数据同步

    1.sql表 用户数据库: tb_user:用户表,其中包含用户的详细信息 tb_address:用户地址表 商品数据库 tb_item:商品表 订单数据库 tb_order:用户订单表 tb_order_detail:订单详情表,主要是订单中包含的商品信息 tb_order_logistics:订单物流表,订单的收货人信息 2.模块搭建 feign-api:是

    2024年01月21日
    浏览(43)
  • 面试官:如何遍历 Redis 中的海量数据?

    来源:https://www.toutiao.com/article/6697540366528152077/ 有时候我们需要知道线上的 redis的使用情况 ,尤其需要知道一些 前缀的key值 ,让我们怎么去查看呢?今天给大家分享一个小知识点! 因为我们的用户 token缓存是采用了【user_token:userid】格式的key ,保存用户的token的值。我们运

    2024年02月11日
    浏览(42)
  • 借助KafkaTool在海量Kafka数据快速精准定位/查询目标数据

    解决方案:Kafka命令 + KafkaTool 参数说明: $ip:Kafka服务IP。 $port:Kafka服务端口。 ${topic.name}:要查询的主题。 $timestamp:要查询的时间点(时间戳进行转换的时候要精确到秒)。 其他说明:该命令在Kafka的bin目录下,所以需要跳转到该bin目录下执行该指令(已添加到环境变量

    2024年02月15日
    浏览(48)
  • Redis之bigkey

    目录 1、什么是bigkey? 2、bigkey大的小 3、bigkey有哪些危害? 4、bigkey如何产生? 5、bigkey如何发现? 6、bigkey如何删除? 7、BigKey调优,惰性释放lazyfree 8、生产上限制keys * /flushdb/flushall等危险命令防止误删误用 9、SCAN命令 1、什么是bigkey? bigkey通常用来描述存储大量数据的键。

    2024年01月15日
    浏览(35)
  • Mysql 查询分组数据中每组某一数值最大的数据

    该表表名为customer,  park_id表示园区id,joined_at表示用户的加入时间,created_at表示用户的创建时间。 需求:查出每个园区中,最早加入园区的第一位用户 查出id为 1和9的两条数据 解题思路:       【提示】  此处使用 limit 是为了确保,group by分组的时候会按照子查询中输出的

    2024年02月08日
    浏览(45)
  • 第十三章_Redis中的BigKey

    MoreKey案例 大批量往redis里面插入2000W测试数据key  Linux Bash下面执行,插入100W # 生成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; 通过redis提供的管道--pipe命令插入100W大批量数据 结合自己

    2024年02月03日
    浏览(41)
  • 【redis】redis获取hash结构的海量数据,hgetAll、hscan、hkeys 性能大比拼

    根据上一篇文章:【Redis】 redis hash getKey getValue 两个的性能差别 我们知道hgetAll的性能是极差的,然后我们优化成hkeys的,但是hkeys真的好吗? 下面我们来说一下我们的现场,就是现场我们

    2024年01月22日
    浏览(31)
  • Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计

    在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合。 常见的场景如下: 给一个 userId ,判断用户登陆状态; 显示用户某个月的签到次数和首次签到时间; 两亿用户最近 7 天的签到情况,统计 7 天内连续签到的用户总数; 通常情况下,我们面

    2024年02月02日
    浏览(56)
  • MySQL如何查询根据某一条件分组,再查询出每组数据中时间最早或最晚的数据

    最近遇到个需求,需要先根据A条件进行分组,然后查询出每组数据中时间最近的一条数据,立马就写出了sql语句 但是执行了一下,发现不对,子查询中 order by 貌似失效了,查出来的数据并不是要想要的时间最近的数据。 经过我的研究,发现,想要子查询中使用order by生效,

    2024年03月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包