Следующий код 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)
Результаты еще хуже, когда я использую один хэш.