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

Ber*_*ant 77 redis

我的redis实例似乎变得非常大,我想知道我在那里的多个数据库中消耗了多少内存.Redis的INFO命令只显示了每个数据库的总大小和密钥数量,这并没有给我太多的洞察力......所以在监控redis服务器时给我更多信息的任何工具/想法都将受到赞赏.

Redis文档没有向我显示任何可以返回某些键的消耗内存的命令,所以我想如果任何错误代码会给redis写下很多"垃圾",这可能真的很难找到......

Ber*_*ant 105

所以我解决了我自己的问题:经过redis-cli一段时间的游戏,我发现它DEBUG OBJECT <key>显示出类似于serializedlength键的东西,这实际上是我正在寻找的东西......

对于整个数据库,您需要KEYS *使用您选择的脚本语言聚合所有值不应该太难的值...

糟糕的是redis.io并没有真正掌握大量信息DEBUG OBJECT.

  • @BernhardVallant,谢谢你的回答.我继续编写了一个快速脚本,以人类可读的格式打印所有键及其大小.以为我会分享.:) https://gist.github.com/epicserve/5699837 (15认同)
  • *serializedlength*的值与内存大小无关!它是保存到磁盘上的RDB文件时对象所需的大小.检查源代码:https://github.com/antirez/redis/blob/4082c38a60eedd524c78ef48c1b241105f4ddc50/src/debug.c#L337-L343和https://github.com/antirez/redis/blob/4082c38a60eedd524c78ef48c1b241105f4ddc50/src/rdb .C#L663-L671 (13认同)
  • 仅供参考:不要在AWS ElastiCache Redis上使用DEBUG进行任何尝试,https://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/ClientConfig.RestrictedCommands.html。甚至发现redis-cli --bigkeys都会停滞 (3认同)

mir*_*e2k 57

评论的解决方案值得它自己的答案:

redis-cli --bigkeys
Run Code Online (Sandbox Code Playgroud)

  • big key 与 _key_ 的大小有关,而不是存储的值的大小.. 因此您可以拥有一个值为 4GB 的键“a”,但这不会显示在 bigkeys 中。(这是通过 https://gist.github.com/michael-grunder/9257326 和 https://docs.redislabs.com/latest/ri/memory-optimizations/use-smaller-keys/ 进行的) (2认同)

dog*_*ish 24

MEMORY USAGE key command为您提供密钥及其值需要存储在RAM中的字节数.

报告的用法是数据和管理开销的内存分配总量,这是其值所需的密钥(源redis文档)

  • 这只能使用版本> 4.0 (9认同)

jum*_*and 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  
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  
Run Code Online (Sandbox Code Playgroud)

或者这个:https: //github.com/sripathikrishnan/redis-rdb-tools通过脱机分析dump.rdb文件对整个密钥空间进行全面分析.这个也适用.它可以为您提供数据库中条目的平均/最小/最大大小,甚至可以根据前缀进行操作.


rlo*_*tun 7

您可能会发现对Redis键进行采样并按类型对其进行分组非常有用.Salvatore编写了一个名为redis-sampler的工具,它发出大约10000个RANDOMKEY命令,后跟一个TYPEon检索到的密钥.只需几秒钟或几分钟,您就可以获得关键类型分布的相当准确的视图.

我编写了一个扩展(遗憾的是它不是开源的,因为它与工作有关),它通过正则表达式添加了一些关键名称的内省,让你了解什么类型的应用程序键(根据你的命名结构)使用),存储在Redis中.结合redis-sampler的更一般输出,这可以让您非常了解正在发生的事情.

  • Tks,实际上比"redis-cli --bigkeys"帮助了我更多 (6认同)

Abh*_*k S 7

也可以INFO在redis中查看命令查看内存使用情况

$ redis-cli
127.0.0.1:6379> INFO memory
Run Code Online (Sandbox Code Playgroud)


Don*_*ner 5

也许您可以对 db 文件进行一些内省。该协议相对简单(但没有很好的文档记录),因此您可以为它编写一个解析器来确定哪些单独的键占用了大量空间。


新建议:

您是否尝试使用MONITOR实时查看正在编写的内容?也许您可以找到动态数据的问题。