Login
网站首页 > 文章中心 > 其它

Redis中怎么解决Big?Key问题

作者:小编 更新时间:2023-10-05 10:04:18 浏览量:89人看过

这篇文章主要介绍"Redis中怎么解决Big?Key问题"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Redis中怎么解决Big?Key问题"文章能让粉丝们变的更强解决问题.

第一段:什么是Big Key?

通俗易懂的讲,Big Key就是某个key对应的value很大,占用的redis空间很大,本质上是大value问题.key往往是程序可以自行设置的,value往往不受程序控制,所以呢可能导致value很大.

redis中这些Big Key对应的value值很大,在序列化/反序列化过程中花费的时间很大,所以呢当我们操作Big Key时,通常比较耗时,这就可能导致redis发生阻塞,从而降低redis性能.

用几个实际的例子对大Key的特征进行描述:

● 一个ZSet类型的Key,它的成员数量为10000个(成员数量过多);

● 一个Hash格式的Key,它的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大);

在实际业务中,大Key的判定仍然需要根据Redis的实际使用场景、业务场景来进行综合判断.通常都会以数据大小与成员数量来判定.

第二段:Big Key产生的场景?

①.、redis数据结构使用不恰当

将Redis用在并不适合其能力的场景,造成Key的value过大,如使用String类型的Key存放大体积二进制文件型数据.

没有对无效数据进行定期清理,造成如HASH类型Key中的成员持续不断的增加.即一直往value塞数据,却没有删除机制,value只会越来越大.

业务上线前规划设计考虑不足没有对Key中的成员进行合理的拆分,造成个别Key中的成员数量过多.

第三段:Big Key的危害?

①.、阻塞请求

Big Key对应的value较大,我们对其进行读写的时候,需要耗费较长的时间,这样就可能阻塞后续的请求处理.Redis的核心线程是单线程,单线程中请求任务的处理是串行的,前面的任务完不成,后面的任务就处理不了.

读取Big Key耗费的内存比正常Key会有所增大,如果不断变大,可能会引发OOM(内存溢出),或达到redis的最大内存maxmemory设置值引发写阻塞或重要Key被逐出.

读取单value较大时会占用服务器网卡较多带宽,自身变慢的同时可能会影响该服务器上的其他Redis实例或者应用.

删除一个大Key造成主库较长时间的阻塞并引发同步中断或主从切换.

第四段:如何识别Big Key?

①.、使用redis自带的命令识别

根据传入的对象(Key的名称)来对Key进行分析并返回大量数据,其中serializedlength的值为该Key的序列化长度,需要注意的是,Key的序列化长度并不等同于它在内存空间中的真实长度,此外,debug object属于调试命令,运行代价较大,并且在其运行时,进入Redis的其余请求将会被阻塞直到其执行完毕.并且每次只能查找单个key的信息,官方不推荐使用.

这种方式是在redis实例上执行bgsave,bgsave会触发redis的快照备份,生成rdb持久化文件,然后对dump出来的rdb文件进行分析,找到其中的大key.

优点在于获取的key信息详细、可选参数多、支持定制化需求,结果信息可选择json或csv格式,后续处理方便,其缺点是需要离线操作,获取结果时间较长.

第五段:如何解决Big Key问题?

要解决Big Key问题,无非就是减小key对应的value值的大小,也就是对于String数据结构的话,减少存储的字符串的长度;对于List、Hash、Set、ZSet数据结构则是减少集合中元素的个数.

①.、对大Key进行拆分

将一个Big Key拆分为多个key-value这样的小Key,并确保每个key的成员数量或者大小在合理范围内,然后再进行存储,通过get不同的key或者使用mget批量获取.

如果某个Key有业务不断以增量方式写入大量的数据,并且忽略了其时效性,这样会导致大量的失效数据堆积.可以通过定时任务的方式,对失效数据进行清理.

使用序列化、压缩算法将key的大小控制在合理范围内,但是需要注意序列化、反序列化都会带来一定的消耗.如果压缩后,value还是很大,那么可以进一步对key进行拆分.

补充知识:key设计

(1)【建议】: 可读性和可管理性

保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视,例如:user:{uid}:friends:messages:{mid} 简化为 u:{uid}m:{mid}

反例:包含空格、换行、单双引号以及其他转义字符

关于"Redis中怎么解决Big?Key问题"的内容就介绍到这里了,感谢大家的阅读.如果想了解更多行业相关的知识,可以关注***行业资讯频道,小编每天都会为大家更新不同的知识点.

以上就是土嘎嘎小编为大家整理的Redis中怎么解决Big?Key问题相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章