Redis:显示数据库大小/密钥大小


88

我的redis实例似乎正在变得非常大,我想找出那里的多个数据库中的哪个消耗了多少内存。Redis的INFO命令仅向我显示了每个数据库的总大小和密钥数,这并没有给我带来太多的了解...因此,在监视Redis服务器时向我提供更多信息的任何工具/想法都将受到赞赏。

Redis文档没有向我显示任何可以返回某些键消耗的内存的命令,因此我想如果有错误代码会为Redis写很多“废纸rash”,这可能很难找到...

Answers:


113

因此,我对自己的问题的解决方案是:在玩了redis-cli一段时间之后,我发现它DEBUG OBJECT <key>揭示了像serializedlengthkey之类的东西,实际上这是我在寻找的东西...

对于整个数据库,您需要KEYS *使用自己选择的脚本语言来汇总所有应该不太困难的值...

糟糕的是redis.io并没有太多的信息DEBUG OBJECT


1
序列化的长度是否是整个对象的大小(以字节为单位)?
拉菲安2012年

18
@BernhardVallant,感谢您的回答。我继续写了一个快速脚本,以人类可读的格式打印所有键及其大小。以为我会分享。:) gist.github.com/epicserve/5699837
布伦特·奥康纳

13
serializedlength的值与内存大小无关!它是对象保存到磁盘上的RDB文件时所采用的大小。检查源代码:github.com/antirez/redis/blob/…github.com/antirez/redis/blob/…–
Hugo Tavares

似乎没有办法获取内存中键或值或键值的大小(而不是将大小转储到磁盘上)
Avner Barr,

4
仅供参考:不要在AWS ElastiCache Redis上使用DEBUG进行任何尝试,docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/…。甚至发现redis-cli --bigkeys都将停滞
sonjz 18-4-12


40

MEMORY USAGE key 命令提供了密钥及其值需要存储在RAM中的字节数。

报告的使用情况是其值所需要的关键数据和管理开销的内存分配总数(源redis文档)


11
这只能用来版> 4.0
蒂克

15

看一下这个项目,它基于正则表达式和前缀输出一些有关键空间的有趣统计信息。它使用DEBUG OBJECT命令并扫描数据库,确定键组并估计它们占用的空间百分比。

https://github.com/snmaynard/redis-audit

输出看起来像这样:

Summary  

---------------------------------------------------+--------------+-------------------+---------------------------------------------------  
Key                                                | Memory Usage | Expiry Proportion | Last Access Time                                    
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  
notification_3109439                               | 88.14%       | 0.0%              | 2 minutes                               
user_profile_3897016                               | 11.86%       | 99.98%            | 20 seconds  
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  

或者这个:https//github.com/sripathikrishnan/redis-rdb-tools,它通过脱机分析dump.rdb文件来对整个键空间进行全面分析。这个也很好用。它可以为您的数据库中的条目提供avg / min / max大小,甚至可以基于前缀来实现。


8

您可能会发现对Redis密钥进行采样并按类型对其进行分组非常有用。萨尔瓦托(Salvatore)编写了一个称为redis-sampler的工具,该工具发出大约10000条RANDOMKEY命令,然后发出TYPE检索键。在几秒钟或几分钟之内,您应该可以准确了解密钥类型的分布。

我写了一个扩展(不幸的是,它与工作相关,没有开源),它通过正则表达式增加了对键名的自省,使您可以了解哪种类型的应用程序键(根据您使用的命名结构而定)使用)存储在Redis中。结合redis-sampler的更一般的输出,这应该使您对正在发生的事情有一个非常好的了解。


7
Tks,实际上对我的帮助不止于redis-cli --bigkeys
nmat 2016年

4

也许您可以对db文件进行一些自省。该协议相对简单(但文档尚不完善),因此您可以为其编写一个解析器,以确定哪些单独的键占用了大量空间。


新建议:

您是否尝试过使用MONITOR以查看正在写的内容?也许您可以找到有关移动数据的问题。


似乎很有趣,但是尽管如此,我还是想尝试一种简单的方法来监视服务器上Redis的内存使用情况...检查转储对于我来说似乎更可行,但不必多说转储是一些演出吧!
Bernhard Vallant 2011年

您应该询问redis邮件列表。我听到这个“最佳”答案真的很有趣。
唐纳德·麦纳

那么已经尝试INFOMONITOR,但可能主要的问题是,那个时候不看Redis的增长非常大的...
伯恩哈德Vallant

好的,我将其发布到他们的邮件列表中,但我自己也找到了答案...请参见下文!
2011年

回覆。db文件的自省-我编写了一个脚本来分析dump.rdb文件并输出一个csv文件,报告每个键使用的近似内存。见github.com/sripathikrishnan/redis-rdb-tools
Sripathi Krishnan


1

我通常更喜欢使用密钥采样方法来解决此类情况。

redis-cli -p 6379 -n db_number --bigkeys

例如:-

redis-cli -p 6370 -n 0 --bigkeys


为什么这是“密钥采样”方法?我发现它非常有限,因为它仅显示冰山一角。
MrR
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.