行业资讯 2025年08月6日
0 收藏 0 点赞 629 浏览 7897 个字
摘要 :

文章目录 什么是 Bigkey Bigkey 的危害 Bigkey 如何产生的 如何发现 Bigkey 使用 Redis 的内置命令行 分析 RDB 文件 redis-rdb-tool 如何处理 Bigkey 总结 你在Redis……




  • 什么是 Bigkey
  • Bigkey 的危害
  • Bigkey 如何产生的
  • 如何发现 Bigkey
    • 使用 Redis 的内置命令行
    • 分析 RDB 文件
    • redis-rdb-tool
  • 如何处理 Bigkey
  • 总结

你在Redis开发过程中,是否接触过bigkey呢?遇到了bigkey的问题是如何解决的呢?如果没有,可以认真看完这篇文章,对你肯定有很大的帮助!

在处理 bigkey 问题我们一般可以先从一下几点入手

  • 什么是 bigkey?
  • bigkey 危害?
  • bigkey 是如何产生的?
  • 如何发现 bigkey ?
  • 如何处理 bigkey?

什么是 Bigkey

Bigkey是指在Redis数据库中占据较大存储空间的键值对。这些键通常包含大量数据,可能对Redis的性能和内存利用产生影响。比方说,某个集合、哈希表、列表或有序集合中存储了大量元素的键。

在实际的生产环境中,出现以下两种情况时,我们可以将其视为Bigkey:

  1. 对于字符串类型:如果单个值的大小超过10KB,那么就被认为是Bigkey。同时,如果键本身的大小过大也会被视为问题。
  2. 对于非字符串类型:对于哈希、列表、集合、有序集合,其中的元素数量超过5000个,也会被视为Bigkey的情况。

Bigkey 的危害

超时阻塞问题:由于Redis的单线程特性,对于处理bigkey的操作可能会花费较长时间。

集群节点失衡隐患:在Redis集群中,如果某个节点包含大量的bigkey,可能会导致该节点负载过重,进而引发整个集群节点负载不均衡的问题,从而损害整个集群的性能和稳定性。

备份和恢复复杂性:当需要对Redis进行备份和恢复时,bigkey也会带来困难。这是因为备份和恢复过程需要耗费大量磁盘空间和网络带宽。如果存在大量的bigkey,备份和恢复过程可能会变得异常耗时,且更加复杂。

Bigkey 如何产生的

Bigkey的生成原因通常归因于不良的程序设计或对数据规模估计不足。

为了预防Bigkey的生成,有几个方法可以采取:合理选择数据结构、分割大型字符串、数据压缩以及定期检查数据库中键值对的大小。

通过这些方法,可以有效避免Bigkey问题的产生。

如何发现 Bigkey

使用 Redis 的内置命令行

 $ redis-cli --bigkeys
​
# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type.  You can use -i 0.01 to sleep 0.01 sec
# per SCAN command (not usually needed).
​
[00.00%] Biggest string found so far \'key-419\' with 3 bytes
[05.14%] Biggest list   found so far \'mylist\' with 100004 items
[35.77%] Biggest string found so far \'counter:__rand_int__\' with 6 bytes
[73.91%] Biggest hash   found so far \'myobject\' with 3 fields
​
-------- summary -------
​
Sampled 506 keys in the keyspace!
Total key length in bytes is 3452 (avg len 6.82)
​
Biggest string found \'counter:__rand_int__\' has 6 bytes
Biggest   list found \'mylist\' has 100004 items
Biggest   hash found \'myobject\' has 3 fields
​
504 strings with 1403 bytes (99.60% of keys, avg size 2.78)
1 lists with 100004 items (00.20% of keys, avg size 100004.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
1 hashs with 3 fields (00.20% of keys, avg size 3.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00)

不过需要注意,执行 –bigkeys 时,是通过扫描数据库来查找 bigkey,所以会对 Redis 实例的性能产生影响。

如果是主从,最好使用从节点执行。

# redis-cli 会没扫描 100 次暂停 0.1 秒
./redis-cli  --bigkeys -i 0.1

使用 redis-cli –bigkey 不足:

这个方法只能返回每种类型中最大的那个 bigkey,无法得到大小排在前 N 位的 bigkey;
对于集合类型来说,只统计集合元素个数的多少,而不是实际占用的内存量。但是,一个集合中的元素个数多,并不一定占用的内存就多。因为,有可能每个元素占用的内存很小,这样的话,即使元素个数有很多,总内存开销也不大

统计 value 内存大小,可以通过 scan 命令迭代,具体步骤如下:

通过 SCAN 命令进行全局扫描。

#SCAN cursor [MATCH pattern] [COUNT count]
#cursor - 游标。
#pattern - 匹配的模式。
#count - 可选,用于指定每次迭代返回的 key 的数量,默认值为 10 。
redis 127.0.0.1:6379> scan 0   # 使用 0 作为游标,开始新的迭代
1) \"17\"                        # 第一次迭代时返回的游标
2)  1) \"key:12\"
    2) \"key:8\"
    3) \"key:4\"
    4) \"key:14\"
    5) \"key:16\"
    6) \"key:17\"
    7) \"key:15\"
    8) \"key:10\"
    9) \"key:3\"
   10) \"key:7\"
   11) \"key:1\"
redis 127.0.0.1:6379> scan 17  # 使用的是第一次迭代时返回的游标 17 开始新的迭代
1) \"0\"
2) 1) \"key:5\"
   2) \"key:18\"
   3) \"key:0\"
   4) \"key:2\"
   5) \"key:19\"
   6) \"key:13\"
   7) \"key:6\"
   8) \"key:9\"
   9) \"key:11\"

通过 TYPE 命令判断 key 的类型。

redis> SET weather \"sunny\"
OK
​
redis> TYPE weather
string

根据 key 类型,统计 value 大小

a. String 类型:STRLEN 就是占用内存大小。

> STRLEN 22de5ac4e8074ff4bf03d777850de62c
640

b. 集合类型:如果已知元素大小,乘上元素个数就是占用内存大小。

# List
redis 127.0.0.1:6379> LLEN list1
(integer) 2
​
# Hash
redis 127.0.0.1:6379> HLEN myhash
(integer) 2
​
# Set
redis 127.0.0.1:6379> SCARD myset
(integer) 2
​
# Sorted Set
redis 127.0.0.1:6379> ZCARD myzset
(integer) 2

c. 未知可以通过 memory usage

memory usage 0188a87272cb4558905b0cfbe64a30d6
1624

分析 RDB 文件

先执行下面的命令

set hello redis
save

找到 dump.rdb 文件,并执行下面命令

od -A x -t x1c -v dump.rdb
000000  52  45  44  49  53  30  30  30  39  fa  09  72  65  64  69  73
         R   E   D   I   S   0   0   0   9 372  \\t   r   e   d   i   s
000010  2d  76  65  72  05  35  2e  30  2e  37  fa  0a  72  65  64  69
         -   v   e   r 005   5   .   0   .   7 372  \\n   r   e   d   i
000020  73  2d  62  69  74  73  c0  40  fa  05  63  74  69  6d  65  c2
         s   -   b   i   t   s 300   @ 372 005   c   t   i   m   e 302
000030  12  ff  54  64  fa  08  75  73  65  64  2d  6d  65  6d  c2  c8
       022 377   T   d 372  \\b   u   s   e   d   -   m   e   m 302 310
000040  bb  0d  00  fa  0c  61  6f  66  2d  70  72  65  61  6d  62  6c
       273  \\r  
od -A x -t x1c -v dump.rdb
000000  52  45  44  49  53  30  30  30  39  fa  09  72  65  64  69  73
R   E   D   I   S   0   0   0   9 372  \\t   r   e   d   i   s
000010  2d  76  65  72  05  35  2e  30  2e  37  fa  0a  72  65  64  69
-   v   e   r 005   5   .   0   .   7 372  \\n   r   e   d   i
000020  73  2d  62  69  74  73  c0  40  fa  05  63  74  69  6d  65  c2
s   -   b   i   t   s 300   @ 372 005   c   t   i   m   e 302
000030  12  ff  54  64  fa  08  75  73  65  64  2d  6d  65  6d  c2  c8
022 377   T   d 372  \\b   u   s   e   d   -   m   e   m 302 310
000040  bb  0d  00  fa  0c  61  6f  66  2d  70  72  65  61  6d  62  6c
273  \\r  \\0 372  \\f   a   o   f   -   p   r   e   a   m   b   l
000050  65  c0  00  fe  00  fb  01  00  00  05  68  65  6c  6c  6f  05
e 300  \\0 376  \\0 373 001  \\0  \\0 005   h   e   l   l   o 005
000060  72  65  64  69  73  ff  db  4d  64  00  c2  0b  2d  8d
r   e   d   i   s 377 333   M   d  \\0 302  \\v   - 215
00006e

372 \\f a o f - p r e a m b l
000050 65 c0 00 fe 00 fb 01 00 00 05 68 65 6c 6c 6f 05
e 300

od -A x -t x1c -v dump.rdb
000000  52  45  44  49  53  30  30  30  39  fa  09  72  65  64  69  73
R   E   D   I   S   0   0   0   9 372  \\t   r   e   d   i   s
000010  2d  76  65  72  05  35  2e  30  2e  37  fa  0a  72  65  64  69
-   v   e   r 005   5   .   0   .   7 372  \\n   r   e   d   i
000020  73  2d  62  69  74  73  c0  40  fa  05  63  74  69  6d  65  c2
s   -   b   i   t   s 300   @ 372 005   c   t   i   m   e 302
000030  12  ff  54  64  fa  08  75  73  65  64  2d  6d  65  6d  c2  c8
022 377   T   d 372  \\b   u   s   e   d   -   m   e   m 302 310
000040  bb  0d  00  fa  0c  61  6f  66  2d  70  72  65  61  6d  62  6c
273  \\r  \\0 372  \\f   a   o   f   -   p   r   e   a   m   b   l
000050  65  c0  00  fe  00  fb  01  00  00  05  68  65  6c  6c  6f  05
e 300  \\0 376  \\0 373 001  \\0  \\0 005   h   e   l   l   o 005
000060  72  65  64  69  73  ff  db  4d  64  00  c2  0b  2d  8d
r   e   d   i   s 377 333   M   d  \\0 302  \\v   - 215
00006e

376

od -A x -t x1c -v dump.rdb
000000  52  45  44  49  53  30  30  30  39  fa  09  72  65  64  69  73
R   E   D   I   S   0   0   0   9 372  \\t   r   e   d   i   s
000010  2d  76  65  72  05  35  2e  30  2e  37  fa  0a  72  65  64  69
-   v   e   r 005   5   .   0   .   7 372  \\n   r   e   d   i
000020  73  2d  62  69  74  73  c0  40  fa  05  63  74  69  6d  65  c2
s   -   b   i   t   s 300   @ 372 005   c   t   i   m   e 302
000030  12  ff  54  64  fa  08  75  73  65  64  2d  6d  65  6d  c2  c8
022 377   T   d 372  \\b   u   s   e   d   -   m   e   m 302 310
000040  bb  0d  00  fa  0c  61  6f  66  2d  70  72  65  61  6d  62  6c
273  \\r  \\0 372  \\f   a   o   f   -   p   r   e   a   m   b   l
000050  65  c0  00  fe  00  fb  01  00  00  05  68  65  6c  6c  6f  05
e 300  \\0 376  \\0 373 001  \\0  \\0 005   h   e   l   l   o 005
000060  72  65  64  69  73  ff  db  4d  64  00  c2  0b  2d  8d
r   e   d   i   s 377 333   M   d  \\0 302  \\v   - 215
00006e

373 001

od -A x -t x1c -v dump.rdb
000000  52  45  44  49  53  30  30  30  39  fa  09  72  65  64  69  73
R   E   D   I   S   0   0   0   9 372  \\t   r   e   d   i   s
000010  2d  76  65  72  05  35  2e  30  2e  37  fa  0a  72  65  64  69
-   v   e   r 005   5   .   0   .   7 372  \\n   r   e   d   i
000020  73  2d  62  69  74  73  c0  40  fa  05  63  74  69  6d  65  c2
s   -   b   i   t   s 300   @ 372 005   c   t   i   m   e 302
000030  12  ff  54  64  fa  08  75  73  65  64  2d  6d  65  6d  c2  c8
022 377   T   d 372  \\b   u   s   e   d   -   m   e   m 302 310
000040  bb  0d  00  fa  0c  61  6f  66  2d  70  72  65  61  6d  62  6c
273  \\r  \\0 372  \\f   a   o   f   -   p   r   e   a   m   b   l
000050  65  c0  00  fe  00  fb  01  00  00  05  68  65  6c  6c  6f  05
e 300  \\0 376  \\0 373 001  \\0  \\0 005   h   e   l   l   o 005
000060  72  65  64  69  73  ff  db  4d  64  00  c2  0b  2d  8d
r   e   d   i   s 377 333   M   d  \\0 302  \\v   - 215
00006e
od -A x -t x1c -v dump.rdb
000000  52  45  44  49  53  30  30  30  39  fa  09  72  65  64  69  73
R   E   D   I   S   0   0   0   9 372  \\t   r   e   d   i   s
000010  2d  76  65  72  05  35  2e  30  2e  37  fa  0a  72  65  64  69
-   v   e   r 005   5   .   0   .   7 372  \\n   r   e   d   i
000020  73  2d  62  69  74  73  c0  40  fa  05  63  74  69  6d  65  c2
s   -   b   i   t   s 300   @ 372 005   c   t   i   m   e 302
000030  12  ff  54  64  fa  08  75  73  65  64  2d  6d  65  6d  c2  c8
022 377   T   d 372  \\b   u   s   e   d   -   m   e   m 302 310
000040  bb  0d  00  fa  0c  61  6f  66  2d  70  72  65  61  6d  62  6c
273  \\r  \\0 372  \\f   a   o   f   -   p   r   e   a   m   b   l
000050  65  c0  00  fe  00  fb  01  00  00  05  68  65  6c  6c  6f  05
e 300  \\0 376  \\0 373 001  \\0  \\0 005   h   e   l   l   o 005
000060  72  65  64  69  73  ff  db  4d  64  00  c2  0b  2d  8d
r   e   d   i   s 377 333   M   d  \\0 302  \\v   - 215
00006e

005 h e l l o 005
000060 72 65 64 69 73 ff db 4d 64 00 c2 0b 2d 8d
r e d i s 377 333 M d

od -A x -t x1c -v dump.rdb
000000  52  45  44  49  53  30  30  30  39  fa  09  72  65  64  69  73
R   E   D   I   S   0   0   0   9 372  \\t   r   e   d   i   s
000010  2d  76  65  72  05  35  2e  30  2e  37  fa  0a  72  65  64  69
-   v   e   r 005   5   .   0   .   7 372  \\n   r   e   d   i
000020  73  2d  62  69  74  73  c0  40  fa  05  63  74  69  6d  65  c2
s   -   b   i   t   s 300   @ 372 005   c   t   i   m   e 302
000030  12  ff  54  64  fa  08  75  73  65  64  2d  6d  65  6d  c2  c8
022 377   T   d 372  \\b   u   s   e   d   -   m   e   m 302 310
000040  bb  0d  00  fa  0c  61  6f  66  2d  70  72  65  61  6d  62  6c
273  \\r  \\0 372  \\f   a   o   f   -   p   r   e   a   m   b   l
000050  65  c0  00  fe  00  fb  01  00  00  05  68  65  6c  6c  6f  05
e 300  \\0 376  \\0 373 001  \\0  \\0 005   h   e   l   l   o 005
000060  72  65  64  69  73  ff  db  4d  64  00  c2  0b  2d  8d
r   e   d   i   s 377 333   M   d  \\0 302  \\v   - 215
00006e

302 \\v - 215
00006e

一个RDB文件主要由三个部分构成:

  1. 文件头部分:包含了Redis的魔数、RDB版本、Redis版本、RDB创建时间、键值对所占内存大小等信息。
  2. 文件数据部分:包括了Redis数据库中的所有键值对数据。
  3. 文件尾部分:包含RDB文件的结束标识符,以及用于校验的文件校验值。这个校验值在Redis服务器加载RDB文件时用来检查文件是否被篡改过。

这里解读文件的一部分
如何排查和解决Redis Bigkey的有效策略
RDB 文件格式主要如下:
如何排查和解决Redis Bigkey的有效策略

type 类型如下
# 0 =  \"String Encoding\"
# 1 =  \"List Encoding\"
# 2 =  \"Set Encoding\"
# 3 =  \"Sorted Set Encoding\"
# 4 =  \"Hash Encoding\"
# 9 =  \"Zipmap Encoding\"
# 10 = \"Ziplist Encoding\"
# 11 = \"Intset Encoding\"
# 12 = \"Sorted Set in Ziplist Encoding\"
# 13 = \"Hashmap in Ziplist Encoding\"

这里的type常量代表特定的对象类型或底层编码。当服务器读取RDB文件中的键值对数据时,程序会根据type来决定如何读取和解释对应的value。

键(key)始终是一个字符串对象,其编码方式与String类型的值(String Encoding)相同。根据不同的type以及所保存内容的长度,存储的value的结构和长度也会有所不同。

若需解析其他类型的值,则需要对Redis对象的底层编码结构有一定了解。以下是一个简化的关系图:
如何排查和解决Redis Bigkey的有效策略
因此,与直接调用Redis服务器命令来获取bigkey相比,分析RDB文件是一个不错的选择。

redis-rdb-tool

从文档中可以看到 redis-rdb-tool 的主要功能:

生成内存报告;
将 dump.rdb 文件转化为 json 格式;
比较两个 dump 文件等。

将 dump.rdb 文件转化为 json 格式。

rdb --command json dump.rdb 
[{\"hello\":\"redis\"}]

有了 json 数据之后,我们就可以方法对 Redis 的数据进行统计和监控,也不会对 Redis Server 产生影响。

具体使用手册可以访问redis-rdb-tool

如何处理 Bigkey

面对Bigkey问题,不应立即删除,而是应该通知调用方,让其采取适当措施。这可能涉及选择合适的数据结构、拆分大型字符串或进行数据压缩等方法。

当发现Redis性能下降时,可以通过以下清单来排查问题:

  1. 是否使用了复杂度较高的命令或查询全量数据;
  2. 是否有操作Bigkey;
  3. 大量的Key集中过期;
  4. 内存使用达到了maxmemory设置的阈值;
  5. 客户端是否使用了短连接与Redis通信;
  6. 当Redis实例数据较大时,生成RDB或进行AOF重写可能导致fork操作耗时较长;
  7. AOF的写入策略是否设置为always,可能导致每个操作都要同步刷回磁盘;
  8. Redis实例所在机器的内存是否不足,导致发生交换(swap),从而需要从交换分区读取数据;
  9. 进程是否绑定在不合理的CPU上运行;
  10. Redis实例所在机器是否开启了透明大页(transparent huge page)机制;
  11. 网络接口是否受到了过大的压力。

通过检查这些因素,可以更好地理解并解决Redis性能下降的问题。

总结

在有效地优化Redis性能并处理Bigkey的问题方面,采取适当的策略至关重要。Bigkey问题可能影响Redis的性能和稳定性,但删除它们并不是唯一的解决方案。相反,应该通知调用方并选择合适的数据结构、数据拆分、压缩等方法来应对。

此外,在Redis性能下降时,排查问题的清单可以帮助快速找到瓶颈。从使用复杂度高的命令到处理Bigkey、内存管理、客户端连接方式等多方面都需要仔细审查。

通过这些步骤,可以更好地理解和解决Redis性能问题,保证系统的稳定性和可靠性。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/9079.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号