Jedis Storage Confusion, Это проблема Redis или Jedis? - PullRequest
0 голосов
/ 06 октября 2011

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

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

Ответы [ 2 ]

1 голос
/ 06 октября 2011

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

0 голосов
/ 06 октября 2011

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

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

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

...