我一直在尝试在两种情况下评估 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 字节。
我的评估是否正确?