REDIS内存优化了Hashmap vs String键



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

方案1:

    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字节

方案2:

    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时间少的内存是平均节省的(。

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

编辑

方案-1

    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字节。

方案2

    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字节。

我是否正确评估了?

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

调试对象是客户不应使用的调试命令。改用对象命令。

稍有不同的态度,无论您从DebugParams.OBJECT回来什么,几乎可能与您要实现的目标完全无关。

好消息是Redis V4介绍了新的MEMORY(Doctor(命令。以下是 @Antirez的" Redis 4.0的第一个版本候选人"的摘录:

6。新的内存命令。

我喜欢它,就像我喜欢延迟医生一样,曾经引入的延迟医生削减了邮件列表中的"我的redis slowis slow"抱怨的百分比 占一小部分。现在我们也有记忆问题。

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

您在地球上的任务并填写一些数据。新的山姆和我 重新启动后,将立即返回我们的编程。

电影权利主可能会起诉我,以汲取科幻对话的灵感,但这很好。我会为我带来橙色 在监狱中。

内存远不止于此。

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"

使用子命令的内存使用情况报告将非常有用,但也将提供"统计信息"提供的深度信息。

目前所有这些都没有完全记录下来,所以请弄清楚它的作用。