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

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

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

【问题讨论】:

    标签: redis


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案2】:

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

    redis-cli --bigkeys
    

    【讨论】:

    【解决方案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  
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-07-15
              • 2011-02-04
              • 2011-06-11
              • 1970-01-01
              • 2015-09-28
              • 1970-01-01
              • 2020-08-09
              • 1970-01-01
              相关资源
              最近更新 更多