Redis:显示键的数据库大小/大小

Posted

技术标签:

【中文标题】Redis:显示键的数据库大小/大小【英文标题】:Redis: Show database size/size for keys 【发布时间】:2011-11-30 02:42:52 【问题描述】:

我的 redis 实例似乎变得非常大,我想知道我在那里拥有的多个数据库中的哪个消耗了多少内存。 Redis 的INFO 命令只是向我显示了每个数据库的总大小和密钥数量,这并没有给我太多的洞察力......因此,任何在监视 redis 服务器时为我提供更多信息的工具/想法将不胜感激。

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

【问题讨论】:

【参考方案1】:

所以我对自己问题的解决方案:在玩了redis-cli 一段时间后,我发现DEBUG OBJECT <key> 揭示了类似于serializedlength 的键,这实际上是我一直在寻找的东西......

对于整个数据库,您需要汇总 KEYS * 的所有值,这对于您选择的脚本语言应该不会太难...

不好的是redis.io 并没有太多关于DEBUG OBJECT 的信息。

【讨论】:

序列化长度是整个对象的大小,以字节为单位吗? @BernhardVallant,感谢您的回答。我继续编写了一个快速脚本,以人类可读的格式打印所有键及其大小。以为我会分享。 :) gist.github.com/epicserve/5699837 serializedlength 的值与内存大小无关!它是对象保存到磁盘上的 RDB 文件时所占用的大小。查看源代码:github.com/antirez/redis/blob/…和github.com/antirez/redis/blob/… 似乎没有办法获取内存中键或值或键值的大小(不是转储到磁盘的大小) 仅供参考:不要费心尝试在 AWS ElastiCache Redis 上使用 DEBUG 进行任何操作,docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/…。甚至发现 redis-cli --bigkeys 会停止【参考方案2】:

来自 cmets 的解决方案值得拥有自己的答案:

redis-cli --bigkeys

【讨论】:

big keys 大约是 key 的大小,而不是存储的值的大小 .. 所以你可以有一个 a 的 key 和一个 4GB 的值,但是这个不会出现在 bigkeys 中。 (这是 gist.github.com/michael-grunder/9257326 和 docs.redislabs.com/latest/ri/memory-optimizations/… )【参考方案3】:

MEMORY USAGE key 命令为您提供键及其值需要存储在 RAM 中的字节数。

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

【讨论】:

这个只能用版本>4.0【参考方案4】:

看看这个项目,它基于正则表达式和前缀输出一些关于键空间的有趣统计数据。它使用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 文件对整个键空间进行全面分析。这个也很好用。它可以为您提供数据库中条目的平均/最小/最大大小,甚至可以根据前缀进行。

【讨论】:

【参考方案5】:

您可能会发现对 Redis 键进行采样并按类型对它们进行分组非常有用。 Salvatore 编写了一个名为redis-sampler 的工具,它发出大约10000 个RANDOMKEY 命令,然后在检索到的键上发出TYPE。在几秒钟或几分钟内,您应该可以相当准确地了解密钥类型的分布。

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

【讨论】:

Tks,实际上比redis-cli --bigkeys帮助我更多【参考方案6】:

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


新建议:

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

【讨论】:

似乎很有趣,但我试图找到一种简单的方法来监控服务器上redis的内存消耗......检查转储似乎对我来说更实用,而不是也提到转储现在是几场演出! 你应该询问 redis 邮件列表。我真的很想听到这个“最佳”答案。 好吧,INFOMONITOR 已经试过了,但可能主要问题是,当不看 redis 时,它变得非常大...... 好的,我将它发布到他们的邮件列表中,但我自己也找到了答案......见下文! 重新。对 db 文件的自省 - 我编写了一个脚本来解析 dump.rdb 文件并输出一个 csv 文件,报告每个键使用的大致内存。见github.com/sripathikrishnan/redis-rdb-tools【参考方案7】:

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

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

例如:-

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

【讨论】:

为什么是“关键抽样”方法?我发现它非常有限,因为它只显示了冰山一角。【参考方案8】:

如果你知道前缀就可以快速而肮脏地对一组键求和:

echo "keys userfeed*" | redis-cli -h 10.168.229.48 | xargs -I echo "debug object " | redis-cli -h 10.168.229.48 | awk 'print $5' | cut -
d: -f2 | awk 's+=$1 END print s'

这给出了以字节为单位的大小。请记住,这是“序列化长度”而不是内存中的大小。

以字节为单位获取内存大小:

echo "keys op*" | redis-cli -h 10.168.229.48 | xargs -I echo "memory usage  samples 0" | redis-cli -h 10.168.229.48 | awk 's+=$1 END pr
int s'

【讨论】:

【参考方案9】:

您可以使用.net 应用程序https://github.com/abhiyx/RedisSizeCalculator 计算redis key的大小,

请随时提出您的反馈意见

【讨论】:

【参考方案10】:

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

$ redis-cli
127.0.0.1:6379> INFO memory

【讨论】:

这将提供整体内存信息,但不会提供 OP 要求的数据库级别。【参考方案11】:

单线。所有 redis 键和对应的已用内存。

redis-cli keys "*" | while read line; do echo -n "$line: "; redis-cli memory usage $line; done

【讨论】:

【参考方案12】:

怎么样

redis-cli get KEYNAME | wc -c  

【讨论】:

以上是关于Redis:显示键的数据库大小/大小的主要内容,如果未能解决你的问题,请参考以下文章

固定大小键的最快持久键/值数据库并且仅插入/获取(无删除/更新)? [关闭]

Redis++:Redis 大 key的发现与删除方法全解析

redis中的数据占用内存大小分析

Redis:数据库大小与内存的比率?

2. Redis 常用命令

带有redis的消息包,其中数据大小不大