Redis的MoreKey和BigKey问题

这篇具有很好参考价值的文章主要介绍了Redis的MoreKey和BigKey问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、MoreKey案例

大批量往Redis里面插入200w测试数据key

在Linux Bash下面执行,插入200w数据

for((i=1;i<=200*10000;i++)); do echo "set k$i v$i">>/root/redisTest.txt;done;

使用命令 tail -10 redisTest.txt 查看最后10行记录

Redis的MoreKey和BigKey问题

通过redis提供的管道 --pipe命令插入200W大批量数据

time cat /root/redisTest.txt | redis-cli -h 127.0.0.1 -p 6381 -a 123456 --pipe

time用于查看耗时多长

Redis的MoreKey和BigKey问题

可以看出插入200w条数据,耗时才不到6秒,还是非常快的

尝试使用 keys * ,查看所有的key花费多长时间

Redis的MoreKey和BigKey问题

花费29秒,但是如果遇到数量更大,网路状况更差等情况,时间将会进一步变长
keys *这个指令有致命的弊端,在实际环境中最好不要使用

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

生产上限制keys * /flushdb/flushall等危险命令以防止误删误用?
通过配置设置禁用这些命令,redis.conf在SECURITY这一 项中

Redis的MoreKey和BigKey问题

配置完成,重新启动,再次实验
Redis的MoreKey和BigKey问题

如果就想遍历,但是又不用keys * 避免卡顿,那该怎么办呢?
此时可以使用scan命令,类似mysql中的limit,但不完全相同,它用于迭代数据库中的数据库键

Redis SCAN 命令及其相关命令 SSCAN, HSCAN ZSCAN 命令都是用于增量遍历集合中的元素

SCAN 命令用于迭代当前数据库中的数据库键
SSCAN 命令用于迭代集合键中的元素
HSCAN 命令用于迭代哈希键中的键值对
ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)

redis SCAN 命令基本语法如下:

SCAN cursor [MATCH pattern] [COUNT count]
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10 。

以上列出的四个命令都支持增量式迭代, 它们每次执行都只会返回少量元素, 所以这些命令可以用于生产环境, 而不会出现像 KEYS 命令、 SMEMBERS 命令带来的问题 —— 当 KEYS 命令被用于处理一个大的数据库时, 又或者 SMEMBERS 命令被用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。

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

SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代,而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。例如:

Redis的MoreKey和BigKey问题

在上面这个例子中, 第一次迭代使用 0 作为游标, 表示开始一次新的迭代。第二次迭代使用的是第一次迭代时返回的游标, 也就是命令回复第一个元素的值 —— 15

COUNT 选项

虽然 SCAN 命令不保证每次迭代所返回的元素数量, 但我们可以使用 COUNT 选项, 对命令的行为进行一定程度上的调整。 COUNT 选项的作用就是让用户告知迭代命令, 在每次迭代中应该从数据集里返回多少元素。虽然这个选项只是对增量式迭代命令的一种提示(hint), 但是在大多数情况下, 这种提示都是有效的。

Redis的MoreKey和BigKey问题

MATCH 选项

和 KEYS 命令一样,让命令只返回和给定模式相匹配的元素, 这一点可以通过在执行增量式迭代命令时, 通过给定 MATCH 参数来实现。

Redis的MoreKey和BigKey问题

2、BigKey案例

多大才算Big

大的内容不是key本身,而是它对应的value
string类型控制在10KB以内,hash、list、 set、 zset元素 个数不要超过5000

为什么list、hash、 set和zset个数超过5000就是bigkey?
list最多可以包含232-1个元素,接近43亿,hash也可以存储接近43个键值对…
确实理论上能存储这么多数据,但是实际上谁会存这么多数据呀?理论和实际还是有很大区别的

BigKey有哪些危害?

  1. 内存占用过大:BigKey会占用较多的内存空间,如果Redis中存在过多的BigKey,会导致Redis的内存占用过大,可能会引起系统性能下降、甚至OOM(Out of Memory)错误。

  2. 网络传输效率低下:当从Redis中读取BigKey时,由于数据量较大,会导致网络传输效率低下,造成读取延迟和网络拥堵。

  3. 数据备份和恢复困难:在进行Redis数据备份和恢复时,BigKey会增加备份和恢复的时间和成本,同时也会增加备份文件和恢复文件的大小。

  4. 内存碎片问题:当Redis删除一个BigKey时,由于其占用的内存空间较大,可能会导致内存碎片问题,从而影响Redis的内存管理效率。

如何产生?

社交类:比如某个明星的粉丝列表,典型案例粉丝逐步递增
汇总统计:某个报表,月日年经年累月的积累

如何发现?

命令:redis-cli --bigkeys

该命令的优点:
给出每种数据结构Top1bigkey,同时给出每种数据类型的键值个数+平均大小

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

redis-cli --bigkeys -a 123456 -p 6381

Redis的MoreKey和BigKey问题

命令:MEMORY USAGE 键

MEMORY USAGE 命令给出一个 key 和它的值在 RAM 中所占用的字节数。
返回的结果是 key 的值以及为管理该 key 分配的内存总字节数。

Redis的MoreKey和BigKey问题

如何删除?

非字符串的bigkey,不要使用del删除,使用hscan、sscan、 zscan方式渐进式删除, 同时要注意防止bigkey过期时间自动删除问题(例如一个200万的zset设置1小时过期,会触发del操作,造成阻塞,且该操作不会出现在慢查询中

比如:
Redis的MoreKey和BigKey问题

每次都一次删除一点,等到数据量小了之后,再一次性全部删除

如果是字符串的BigKey,则用unlink
Redis的MoreKey和BigKey问题

BigKey生产调优

Redis的MoreKey和BigKey问题

使用惰性删除,提高效率文章来源地址https://www.toymoban.com/news/detail-418320.html

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

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

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

相关文章

  • MySQL---使用索引优化、大批量插入数据优化

    1. 使用索引优化 索引是数据库优化最常用也是最重要的手段之一 , 通过索引通常可以帮助用户解决大多数的 MySQL 的性能优化问题: 1.1 避免索引失效应用-全值匹配 该情况下,索引生效,执行效率高。 1.2 避免索引失效应用-最左前缀法则 1.3 避免索引失效应用-其他匹配原则

    2024年02月07日
    浏览(53)
  • Jmeter(三十一):制造大批量的用户数据数据

    需求:因测试需要,要造100w用户数据,通过用户名、手机号、密码可新增用户,其中用户名和电话号码要求100w用户不能重复 要点: 1、通过Bean shell Sampler实现用户名和手机号的足够随机。 符合我们常用规则的手机号:第一位为1,第二位为3-9,后面的9位为0-9即可。 phone=${_

    2024年02月10日
    浏览(43)
  • 如何使用python快速将大批量图片合成为视频?

    由于CSDN大批量导入图片容易出现乱序,本程序将支撑图片转为视频,便于用视频的方式展示文件内容。 由于图片名称复杂多样,为便于统一化处理,增强程序的通用性,使用改名程序可以降低手动调整的复杂度。 改名之后的效果: 注意此部分的图片大小仍需要手动修改或输

    2024年02月04日
    浏览(49)
  • cesium实现大批量POI点位聚合渲染优化方案

    cesium目前只提供了entityCluster这个聚合类,使打点聚合更方便快捷的实现,但是一般在真正做项目的时候,大家会经常碰到成千上万个甚至几十万个点位需要聚合打点,那这时候你如果还是用entity去实现的话,怕是要被用户按在地上疯狂摩擦,摩擦。。。😅 我们可以通过模拟

    2024年02月09日
    浏览(44)
  • 远程运维大批量IT设备?向日葵批量部署、分组授权与安全功能解析

    数字化转型的不断推进,给予了企业全方位的赋能,但任何发展都伴随着成本与代价,比如在数字化转型过程中企业内部办公与外部业务所需的不断增加的IT设备数量,就为日常的运维工作提出了更大的挑战。 针对企业面对海量IT设备时的运维难、效率低、容易出错等问题,

    2024年02月14日
    浏览(47)
  • 使用postman做接口测试传入大批量动态参数的方法

    postman是一个非常好用的接口测试工具,而且功能也很强大,今天只简单说一下使用postman如何对一个接口传入大批量参数进行测试的方法。 以我测试的平台为例,我们的平台是做在线教育平台的,我模拟的场景是老师有一门课叫ABC,现在需要有1000个学生加入ABC这门课。我们不

    2024年01月23日
    浏览(64)
  • 记一次 OSS 大批量文件下载的实现 → bat脚本不好玩!

    一天夜里,侄女跟我哥聊天 侄女一脸期待的看着我哥:爸爸,你说妈妈和奶奶谁漂亮啊? 我哥不慌不忙的拿起一粒瓜子,轻声说道:为啥没有你啊? 侄女笑容渐起,似乎得到了她想要的回答,仍继续问道:那妈妈和奶奶还有我,谁漂亮? 我哥瞄了一眼侄女,又拿起一粒瓜子

    2024年02月05日
    浏览(44)
  • ZooKeeper+Kafka+ELK+Filebeat集群搭建实现大批量日志收集和展示

    大致流程:将nginx 服务器(web-filebeat)的日志通过filebeat收集之后,存储到缓存服务器kafka,之后logstash到kafka服务器上取出相应日志,经过处理后写入到elasticsearch服务器并在kibana上展示。 一、集群环境准备 二、搭建zookeeper集群 前提条件:三台机器分别修改时区、关闭防火墙

    2024年02月04日
    浏览(48)
  • Python 自动获取大批量excel数据并填写到网页表单(pandas;selenium)

    自动获取大批量excel数据并填写到网页表单 部分网页获取下拉列表点击的方式有所差异 这个请根据网页源码自做选择 一定要学会使用IPDB调试工具 太好用了!!!! 可能需要pip update一下 看提示 很好解决 没有报错最好啦 Python真是太好用了 办公利器啊!!!!

    2024年02月12日
    浏览(50)
  • 大批量数据导出csv,平替导出excel性能优化解决方案封装工具类

            有些业务逻辑需要在导出非常大量的数据,几百甚至几千万的数据这个时候再导出excel来对于性能都不是很友好,这个时候就需要替换实现思路来解决这个问题。         本文章提供了两种解决的方案,也是两种从数据库中拿取数据的方式一种是原生的jdbc一种是使用

    2024年01月16日
    浏览(73)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包