【问题标题】:How to evaluate memory footprint of redis key-value in rails app?如何评估rails应用程序中redis键值的内存占用?
【发布时间】:2021-08-05 08:01:42
【问题描述】:

我想为每个用户存储一些用户的信息到 redis。数据类型使用key-value。

例如:

$redis.set("user_info:12345", #{some data})

有没有办法评估内存占用?

我认为redis的key和value都会消耗内存,怎么知道消耗了多少内存?

【问题讨论】:

  • 你想获取键值的大小,或者服务器的内存信息?
  • 我想得到键值的大小。

标签: ruby-on-rails redis


【解决方案1】:

从 v4 开始,我们的 MEMORY USAGE 命令做得更好,反映了键名、它们的值以及内部数据结构的所有相关开销的整个 RAM 消耗。

$redis.memory :usage, key_name

DEBUG OBJECT 输出不是衡量 Redis 中键的内存消耗的可靠方法 - serializedlength 字段以持久化对象所需的字节数给出,而不是内存中的实际占用空间,其中包括顶部的各种管理开销数据本身。

为了说明这一点,我创建了一组 250 万个整数并比较了每个整数的输出:

> r.memory :usage, 'testkey'
=> 132003825

> r.debug :object, 'testkey'
=> "Value at:0x7fe739e09a00 refcount:1 encoding:hashtable serializedlength:12404474 lru:729393 lru_seconds_idle:68"
  • MEMORY USAGE 报告 132,003,825 字节 (126 MiB)
  • DEBUG OBJECT 仅报告 12,404,474 字节 (12 MiB) ?

【讨论】:

    【解决方案2】:

    您可以使用DEBUG OBJECT 命令获取键值的序列化长度:

    $redis.set("hello", "world")
    $redis.debug("object", "hello")
    # => "Value at:0x7f86f350a8d0 refcount:1 encoding:raw serializedlength:6 lru:2421685 lru_seconds_idle:13"
    

    如果你想提取那个数字,你可以使用这个正则表达式:/serializedlength:(\d+)/

    size = $redis.debug("object", "hello").match(/serializedlength:(\d+)/)[1].to_i
    # => 6
    

    【讨论】:

    • [serializedlength:6] 表示六个字节?
    • @liuzxc 看起来是这样,但是关于该命令的文档非常稀少。
    • 此命令在 Elasticache Redis 上被禁用。希望有另一种方式。
    猜你喜欢
    • 2019-07-25
    • 2016-01-10
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多