在Redis中查找最大对象的最简单方法是什么?

bvuwiixz  于 2023-10-15  发布在  Redis
关注(0)|答案(6)|浏览(162)

我在生产中有一个20 GB + rdb转储。我怀疑有一组特殊的钥匙在膨胀。我想有一种方法,总是现场的前100个最大的对象从静态转储分析或要求它的服务器本身,其中的方式有超过700万对象。
像rdbtools这样的转储分析工具在这个(我认为)非常常见的用例中没有帮助!
我想写一个脚本,用“redis-debugobject”来调试整个键集,但我感觉一定有一些工具我错过了。

mzaanser

mzaanser1#

在redis-cursor中添加了一个选项:redis-cli --bigkeys
基于https://gist.github.com/michael-grunder/9257326的示例输出

$ ./redis-cli --bigkeys

# Press ctrl+c when you have had enough of it... :)
# You can use -i 0.1 to sleep 0.1 sec every 100 sampled keys
# in order to reduce server load (usually not needed).

Biggest string so far: day:uv:483:1201737600, size: 2
Biggest string so far: day:pv:2013:1315267200, size: 3
Biggest string so far: day:pv:3:1290297600, size: 5
Biggest zset so far: day:topref:2734:1289433600, size: 3
Biggest zset so far: day:topkw:2236:1318723200, size: 7
Biggest zset so far: day:topref:651:1320364800, size: 20
Biggest string so far: uid:3467:auth, size: 32
Biggest set so far: uid:3029:allowed, size: 1
Biggest list so far: last:175, size: 51

-------- summary -------

Sampled 329 keys in the keyspace!
Total key length in bytes is 15172 (avg len 46.12)

Biggest   list found 'day:uv:483:1201737600' has 5235597 items
Biggest    set found 'day:uvx:555:1201737600' has 47 members
Biggest   hash found 'day:uvy:131:1201737600' has 2888 fields
Biggest   zset found 'day:uvz:777:1201737600' has 1000 members

0 strings with 0 bytes (00.00% of keys, avg size 0.00)
19 lists with 5236744 items (05.78% of keys, avg size 275618.11)
50 sets with 112 members (15.20% of keys, avg size 2.24)
250 hashs with 6915 fields (75.99% of keys, avg size 27.66)
10 zsets with 1294 members (03.04% of keys, avg size 129.40)
carvr3hs

carvr3hs2#

redis-rdb-tools确实有一个内存报告,它可以满足你的需求。它生成一个CSV文件,每个键都使用内存。然后你可以对它进行排序并找到Top x键。
还有一个实验性的内存分析器,开始做你需要的事情。它还没有完成,所以没有记录。但是你可以试试-https://github.com/sripathikrishnan/redis-rdb-tools/tree/master/rdbtools/cli。当然,我也鼓励你做出贡献!
免责声明:我是这个工具的作者。

hivapdat

hivapdat3#

我对bash脚本很陌生。我得出了这个结论:

for line in $(redis-cli keys '*' | awk '{print $1}'); do echo `redis-cli DEBUG OBJECT $line | awk '{print $5}' | sed 's/serializedlength://g'` $line; done; | sort -h

此脚本

  • 列出所有带有redis-cli keys "*"的密钥
  • 使用redis-cli DEBUG OBJECT获取大小
  • 根据名称和大小对脚本进行排序

这可能会非常慢,因为bash会循环遍历每一个redis键。你有7m键,你可能需要缓存的关键把一个文件。

olqngx59

olqngx594#

如果你有一些键遵循“A:B”或“A:B:*"的模式,我写了一个工具来分析现有的内容,并监控命中率、获取/设置的数量、网络流量、生命周期等。输出与下面的输出类似。
https://github.com/alexdicianu/redis_toolkit

$ ./redis-toolkit report -type memory -name NAME
+----------------------------------------+----------+-----------+----------+
|                     KEY                | NR  KEYS | SIZE (MB) | SIZE (%) |
+----------------------------------------+----------+-----------+----------+
| posts:*                                |      500 |      0.56 |     2.79 |
| post_meta:*                            |      440 |     18.48 |    92.78 |
| terms:*                                |      192 |      0.12 |     0.63 |
| options:*                              |      109 |      0.52 |     2.59 |
crcmnpdw

crcmnpdw5#

为了显示大键使用的内存。您可以将redis-cli --memkeys用于redis mem keys
记忆键:与大键类似,记忆键将查找最大的键,但也会报告平均大小。

$ redis-cli --memkeys

# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).

[00.00%] Biggest string found so far '"counter:__rand_int__"' with 62 bytes
[00.00%] Biggest string found so far '"key:__rand_int__"' with 63 bytes
[00.00%] Biggest hash   found so far '"myhash"' with 86 bytes
[00.00%] Biggest list   found so far '"mylist"' with 860473 bytes

-------- summary -------

Sampled 4 keys in the keyspace!
Total key length in bytes is 48 (avg len 12.00)

Biggest   list found '"mylist"' has 860473 bytes
Biggest   hash found '"myhash"' has 86 bytes
Biggest string found '"key:__rand_int__"' has 63 bytes

1 lists with 860473 bytes (25.00% of keys, avg size 860473.00)
1 hashs with 86 bytes (25.00% of keys, avg size 86.00)
2 strings with 125 bytes (50.00% of keys, avg size 62.50)
0 streams with 0 bytes (00.00% of keys, avg size 0.00)
0 sets with 0 bytes (00.00% of keys, avg size 0.00)
nwlqm0z1

nwlqm0z16#

尝试redis-memory-analyzer-一个控制台工具,可以真实的扫描Redis键空间,并通过键模式汇总内存使用统计。您可以使用这些工具,而无需在生产服务器上进行维护。它显示了Redis服务器中每个键模式的详细统计数据。
你也可以通过所有或选定的Redis类型来扫描Redis数据库,比如“string”,“hash”,“list”,“set”,“zset”。也支持匹配模式。
RMA还尝试通过模式识别键名称,例如,如果您有像'user:100'和'user:101'这样的键,应用程序将在输出中挑选出常见的模式'user:*',这样您就可以分析示例中的大多数内存占用数据。

相关问题