1

我一直在尝试在两种情况下评估 redis 的内存大小。

场景一:

    String commonString = "Test";
    long commonId = 1234567890L;
    int size = 0;
    for(int i = 1; i <= 100; i++)
    {
        jedis.set((commonString+"_"+commonId+"_KEY_"+i).getBytes(),("Value_"+i).getBytes());
        DebugParams debugParams = DebugParams.OBJECT(commonString+"_"+commonId+"_KEY_"+i);
        size += Integer.parseInt(debugged.split(":")[4].split(" ")[0]);
    }

在这种情况下,大小为 892 字节

场景二:

    String commonString = "Test";
    long commonId = 1234567890L;
    int size = 0;
    for(int i = 1; i <= 100; i++)
    {
        jedis.hset((commonString+"_"+commonId).getBytes(),SafeEncoder.encode("KEY_"+i),("Value_"+i).getBytes());
    }
    DebugParams debugParams = DebugParams.OBJECT(commonString+"_"+commonId);
    String debugged = jedis.debug(debugParams);
    size = Integer.parseInt(debugged.split(":")[4].split(" ")[0]);

在这种情况下,它需要 925 个字节。

从 Redis 2.2 开始,许多数据类型都进行了优化,以在达到一定大小时使用更少的空间。哈希、列表、仅由整数组成的集合和排序集,当小于给定的元素数量并且达到最大元素大小时,以非常节省内存的方式编码,使用的内存减少多达 10 倍(5使用更少的内存是平均节省)。

我已经尝试过这种优化,但我还没有实现。配置为默认配置。可能出了什么问题?

已编辑

场景一

    String commonString = "Test";
    long commonId = 1234567890L;
    jedis.flushAll();
    String info1 = jedis.info();
    for(int i = 1; i <= 75; i++)
    {
        jedis.set(commonString+"_"+commonId+"_KEY_"+i, "VALUE_"+i);
    }
    String info2 = jedis.info();

在场景 1 中,info1 中已用内存为“used_memory:844640”,info2 中已用内存为“used_memory:852176”。因此,info2 和 info1 之间的差异是 7536 字节。

情景二

    String commonString = "Test";
    long commonId = 1234567890L;
    jedis.flushAll();
    String info1 = jedis.info();
    for(int i = 1; i <= 75; i++)
    {
        jedis.hset(commonString+"_"+commonId,"KEY_"+i,"VALUE_"+i);
    }
    String info2 = jedis.info();

在场景 2 中,info1 中已用内存为“used_memory:845576”,info2 中已用内存为“used_memory:847208”。因此,info2 和 info1 之间的差异是 1632 字节。

我的评估是否正确?

4

1 回答 1

1

如果您参考有关 的文档DEBUG OBJECT,您将了解到:

DEBUG OBJECT 是客户端不应使用的调试命令。请改为检查 OBJECT 命令。

换一种说法,无论你从中得到什么,很DebugParams.OBJECT可能与你想要实现的目标几乎完全无关。

好消息是 Redis v4 引入了新的MEMORY(Doctor) 命令。以下是@antirez 的“Redis 4.0 的第一个候选版本已经发布”的摘录:

6.新的MEMORY命令。

我喜欢它,就像我喜欢 LATENCY DOCTOR 一样,它曾经将邮件列表中“我的 Redis 很慢”的抱怨减少到一小部分。现在我们也有了它来解决内存问题。

127.0.0.1:6379> MEMORY DOCTOR
Hi Sam, this instance is empty or is using very little memory, my issues detector can't be used in these conditions. Please, leave for

你在地球上的任务并用一些数据填充它。新的 Sam 和我将在我完成重新启动后立即回到我们的编程中。

电影版权所有者可能会起诉我从科幻对话中获取灵感,但这没关系。等我坐牢的时候给我拿橙子。

MEMORY 的作用远不止于此。

127.0.0.1:6379> MEMORY HELP
1) "MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key"
2) "MEMORY STATS                         - Show memory usage details"
3) "MEMORY PURGE                         - Ask the allocator to release memory"
4) "MEMORY MALLOC-STATS                  - Show allocator internal stats"

USAGE 子命令的内存使用报告将非常有用,但“STATS”提供的深入信息也是如此。

目前,所有这些都没有记录在案,所以请尽情探索它到底做了什么。

于 2017-04-27T13:04:15.527 回答