2023-06-21:redis中什么是BigKey?该如何解决?

这篇具有很好参考价值的文章主要介绍了2023-06-21:redis中什么是BigKey?该如何解决?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2023-06-21:redis中什么是BigKey?该如何解决?

答案2023-06-21:

什么是bigkey

bigkey是指存储在Key-Value数据库中的键对应的值所占用的内存空间较大。举个例子,如果值是字符串类型,它可以达到最大512MB的存储空间;如果值是列表类型,最多可以存储 2^32 - 1 个元素,即 4294967295 个元素。

根据数据结构的不同,我们可以将bigkey进一步分为字符串类型的bigkey和非字符串类型的bigkey。

字符串类型的bigkey:这种bigkey指的是在Key-Value数据库中,键对应的字符串值所占用的内存空间较大。一般来说,当一个值超过10KB时,就可以被认为是字符串类型的bigkey。但需要注意的是,这个阈值可以根据具体的业务需求和系统的OPS(每秒操作次数)进行调整,不同的环境可能会有不同的定义。

非字符串类型的bigkey:这种bigkey指的是键对应的值是其他非字符串类型(例如哈希、列表、集合、有序集合等),而这些数据结构中的元素数量多到足以被认为是bigkey。例如,当一个哈希表、列表、集合或有序集合中的元素数量超过较大的阈值时,可以被视为非字符串类型的bigkey。

bigkey在Redis中具有不友好的空间复杂度和时间复杂度,以下是它的危害。

bigkey的危害

bigkey的危害体现在三个方面:

1、内存空间不均匀(平衡):特别是在Redis Cluster中,bigkey可能导致节点的内存空间使用不均匀。当某个节点存储了大量的bigkey时,该节点的内存占用会增加,并且可能超出其他节点的内存使用量。这样就破坏了集群的负载均衡,导致一些节点承受了过多的负载,而其他节点却相对空闲。

2、超时阻塞:由于Redis的单线程特性,操作bigkey可能会耗费较长的时间,这也意味着Redis被阻塞的可能性增大。

3、网络拥塞:获取bigkey时产生的网络流量较大,可能引起网络拥塞问题。

假设一个bigkey的大小为1MB,每秒访问量为1000个请求,那么每秒产生的流量将达到1000MB。对于普通的千兆网卡(以字节计算约为128MB/s)的服务器来说,这将带来巨大的网络负载,甚至可能导致灾难性的影响。尤其是在采用单机多实例的方式部署服务器时,一个大型bigkey的影响最终会波及到其他实例上,后果不堪设想。

bigkey的存在并非完全致命:

如果一个bigkey存在但几乎不被频繁访问,那么主要的问题可能是内存空间的不均衡分布,相对于其他问题来说,这个问题的重要性和紧急性可能较低。然而,如果这个bigkey是一个热点key(频繁被访问),那么它所带来的危害就不容忽视。当一个热点bigkey的访问量特别大时,它可能会对Redis服务器和其他实例产生严重的性能影响。

因此,在实际的开发和运维过程中,密切关注bigkey的存在是非常重要的。特别是对于热点bigkey,需要采取相应的策略来应对,例如数据分片、缓存或其他优化措施,以确保系统的高性能和稳定运行。及时监控和处理bigkey问题,有助于维护整体的系统性能和用户体验。

发现bigkey

使用命令redis-cli --bigkeys可以统计和查看bigkey的分布情况。

2023-06-21:redis中什么是BigKey?该如何解决?

在生产环境中,开发和运维人员通常希望能够自定义bigkey的大小,并且找到真正的bigkey,以便能够定位、解决和优化相关问题。

为了判断一个key是否为bigkey,可以执行DEBUG OBJECT key命令并查看serializedlength属性,它表示key对应的value序列化后的字节数。通过检查这个属性,我们可以确定一个key是否为bigkey。

2023-06-21:redis中什么是BigKey?该如何解决?

当需要遍历多个key时,应避免使用keys命令,而是采用SCAN命令来减轻Redis服务器的压力。

scan

自Redis 2.8版本以后,引入了SCAN命令来高效地解决KEYS命令存在的问题。不同于KEYS命令一次性遍历所有键的方式,SCAN采用渐进式遍历的方式,以解决可能引起阻塞的问题。要完全实现KEYS命令的功能,需要执行多次SCAN命令。可以将其想象为逐步扫描字典中的一部分键,直到所有键都遍历完成。

SCAN命令使用方法如下:

SCAN cursor [MATCH pattern] [COUNT number]
  • cursor是必需的参数,实际上是一个游标。第一次遍历时,游标值为0,每次执行完SCAN命令后,会返回当前游标的值,直到游标值为0,表示遍历已结束。

  • MATCH pattern是可选参数,用于指定键名的模式匹配,类似于KEYS命令的模式匹配功能。

  • COUNT number是可选参数,用于指定每次要遍历的键的数量,其默认值为10,如果需要可以适当增大此参数。

2023-06-21:redis中什么是BigKey?该如何解决?

可以观察到,使用SCAN 0命令的第一次执行结果包含两部分:

第一部分是下一次执行SCAN命令所需的游标值(通常是一个整数)。

第二部分是返回的10个键。

接下来可以继续执行SCAN命令,并使用上一次返回的游标值作为参数,直到游标值变为0,表示所有键都已经遍历完毕。

除了SCAN命令,Redis还提供了针对哈希类型、集合类型和有序集合类型的扫描遍历命令,分别是HSCANSSCANZSCAN。它们的作用是解决类似于HGETALLSMEMBERSZRANGE等可能导致阻塞的操作。这些命令的用法类似于SCAN命令,请参考Redis官方文档获取更多信息。

2023-06-21:redis中什么是BigKey?该如何解决?

渐进式遍历确实可以有效解决KEYS命令可能产生的阻塞问题,但并非完美无瑕。在使用SCAN命令进行遍历过程中,如果键空间有变化(增加、删除、修改),可能会遇到以下问题:新增的键可能没有被遍历到,或者遍历结果中可能包含重复的键。因此,在开发过程中需要考虑这些潜在的情况。

当键值个数较多时,使用SCAN命令结合DEBUG OBJECT执行速度可能较慢,此时可以考虑利用Redis的Pipeline机制来提高性能。对于元素个数较多的数据结构,DEBUG OBJECT命令执行速度较慢,并且可能导致Redis阻塞。因此,如果存在从节点,可以考虑在从节点上执行这些操作。

解决bigkey

解决大键(bigkey)的主要思路是拆分,将存储在大键中的数据(大值)进行拆分,分成多个小的值(value1,value2…valueN)进行存储。

例如,如果大值是一个大的JSON对象,可以通过使用MSET命令将该键的内容拆分存储到各个实例中,或者使用哈希表(hash),其中每个字段代表一个具体属性。可以使用HGETHMGET命令来获取部分值,使用HSETHMSET命令来更新部分属性。

同样地,如果大值是一个大的列表(list),可以将其拆分为多个小的列表(list_1,list_2,list_3…list_N)进行存储。

对于其他数据类型也可以采用类似的拆分策略。

通过拆分大键,可以将大的值分割为小的部分,这样可以更好地利用Redis的内存和性能。这种拆分策略可以根据实际情况进行调整,以满足存储和访问的需求。文章来源地址https://www.toymoban.com/news/detail-496207.html

到了这里,关于2023-06-21:redis中什么是BigKey?该如何解决?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 2023-06-11:redis中,如何在100个亿URL中快速判断某URL是否存在?

    2023-06-11:redis中,如何在100个亿URL中快速判断某URL是否存在? 答案2023-06-11: 传统数据结构的不足 当然有人会想,我直接将网页URL存入数据库进行查找不就好了,或者建立一个哈希表进行查找不就OK了。 当数据量小的时候,这么思考是对的, 确实,将值映射到 HashMap 的 Key,

    2024年02月08日
    浏览(59)
  • 2023-06-13:统计高并发网站每个网页每天的 UV 数据,结合Redis你会如何实现?

    2023-06-13:统计高并发网站每个网页每天的 UV 数据,结合Redis你会如何实现? 答案2023-06-13: 如果统计 PV (页面浏览量)那非常好办,可以考虑为每个网页创建一个独立的 Redis 计数器,并将日期添加为键(key)的后缀。当网页收到请求时,对应的计数器将被递增。对于每天的

    2024年02月08日
    浏览(87)
  • 2023-06-17:说一说redis中渐进式rehash?

    2023-06-17:说一说redis中渐进式rehash? 答案2023-06-17: 在Redis中,如果哈希表的数组一直保持不变,就会增加哈希冲突的可能性,从而降低检索效率。为了解决这个问题,Redis会对数组进行扩容,通常是将数组大小扩大为原来的两倍。然而,这个扩容过程会引起元素在哈希桶中的

    2024年02月09日
    浏览(43)
  • 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)
  • 【Redis】BigKey问题

    海量数据里查询某一固定前缀的key 生产上如何限制 keys * / flushdb / flushall 等危险命令以防止误删误用? MEMORY USAGE 命令用过吗? BigKey问题,多大算big?如何发现?如何删除?如何处理? BigKey你做过调优吗?惰性释放lazyfree了解过吗? MoreKey问题,生产上Redis数据库有1000万条记

    2024年02月04日
    浏览(36)
  • Redis BigKey问题

    1.广告平台,海量数据查询固定前缀的key 不要使用keys , 使用 scan 命令 scan 0 match \\\"user: \\\" 10 2.Memory usage命令用过吗 memory usage key [semples count] :计算每个键值对的字节数 3.bigKey 问题,多大算bigKey,如何发现?如何处理?如何删除 string 类型控制在10k以内,hash,list,set,zset元素个数不要超过

    2024年02月06日
    浏览(36)
  • Redis——BigKey问题

    目录 MoreKey案例 测试数据 如何向redis数据库中一次性的插入100W条数据 如何将 100W条数据一次性写入redis数据库中 遍历百万、千万级别数据能否使用keys *? 生产上如何限制keys *、flushdb、flushall等危险命令? 不使用keys *使用什么遍历? 使用scan命令——用于迭代数据库中的数据库

    2023年04月26日
    浏览(34)
  • 2023-06-01:讲一讲Redis常见数据结构以及使用场景。

    2023-06-01:讲一讲Redis常见数据结构以及使用场景。 答案2023-06-01: 字符串(String) 适合场景 缓存功能 Redis 作为缓存层,MySQL 作为存储层,在大部分请求中,数据的读取通常是从 Redis 中获取。由于 Redis 具有支持高并发的特性,因此缓存层通常能够加速读写操作,并减轻后端

    2024年02月07日
    浏览(61)
  • Redis之bigkey问题解读

    目录 什么是bigkey? bigkey引发的问题 如何查找bigkey redis-cli --bigkeys MEMORY USAGE bigKey如何删除 渐进式删除 unlink bigKey生产调优 什么是bigkey? bigkey简单来说就是存储本身的key值空间太大,或者hash,list,set等存储中value值过多。 具体来衡量的话大key是: String 类型值大于10KB。 Has

    2024年02月09日
    浏览(34)
  • Redis中的BigKey相关问题

    bigkey是指key对应的value所占用的内存空间比较大。例如一个字符串类型的value可以最大存到512MB,一个列表类型的value最多可以存储2^32-1个元素。如果按照数据结构来细分的话,一般分为字符串类型bigkey和非字符串类型bigkey。 字符串类型:体现在单个value值很大,一般认为超过

    2024年01月20日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包