Следующий код Java вставляет миллион пар целых чисел в Redis.
public class JedisInsertion {
public static byte[] fromInt(int v) {
return ByteBuffer.allocate(4).putInt(v).array();
}
public static void main(String args[]) {
Jedis j = new Jedis("localhost");
for (int i = 0;i<1000*1000;i++){
j.set(fromInt(i),fromInt(i));
}
}
}
вот вывод информации Redis
...
used_memory:89319664
arch_bits:64
...
89319664 подразумевает ~ 89 байт на пару ключ-значение.
Вместо этого я ожидал что-то около 8 МБ (4 байта для ключа + 4 байта для значения).
Я также скомпилировал Redis в 32-битном режиме (все еще выполняя тест на 64-битной машине).
Результаты для 32-битной версии Redis:
used_memory: 68831664 => 68 байт на пару ключ-значение.
Оба результата в несколько раз выше, чем я ожидал.
Когда я смотрю на Redis с помощью CLI, я вижу, что типичный ключ будет выглядеть так: "\x00\x00\xc2\xff"
Я ценю ваши отзывы
PS: я использую Redis 2.2.14 и Jedis 2.0 на 64-битной машине.
PSS - я также пытался хранить все значения в одном хэше, как это было предложено в одном из комментариев, вот код:
for (int i = 0;i<1000*1000;i++){
j.hset("my-hash".getBytes(),fromInt(i),fromInt(i));
}
И вот результаты:
used_memory_rss:84676608 (for 32bit build)
used_memory:105319712 (for 64bit build)
Результаты еще хуже, когда я использую один хэш.