Путаница с хранилищем джедаев. Это проблема Redis или Jedis?

Следующий код 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)

Результаты еще хуже, когда я использую один хэш.


person Ali Salehi    schedule 06.10.2011    source источник


Ответы (2)


68 байтов на тип ключа/значения являются правильными. Redis внутренне не хранит вещи в виде простого текстового файла, иначе он не сможет быстро найти его, иметь разные типы объектов и т. д. Есть связанные накладные расходы. Больше информации об этом есть в документации на Redis.io.

person antirez    schedule 06.10.2011

Тот факт, что ваш ключ является нечитаемым двоичным значением, является решением, принятым Jedis, поскольку Redis может использовать в качестве ключа практически что угодно.

Ключи Redis имеют срок действия и другие метаданные, которые занимают дополнительное пространство. Если вас беспокоит пространство, рассмотрите возможность хранения всех ваших значений в одном хэше Redis. Для пар ключ/значение в хеше значительно меньше накладных расходов, чем для стандартных пар ключ/значение.

http://redis.io/topics/memory-optimization

person Carl Zulauf    schedule 06.10.2011