Влияет ли длина имени на производительность в Redis?


Мне нравится использовать подробные имена в Redis, например set-allBooksBelongToUser:$userId.

это нормально или это влияет на производительность?

4 101

4 ответа:

ключ, о котором вы говорите, на самом деле не так уж и долго.

ключ примера, который вы даете, предназначен для набора, методы поиска набора-O (1). Более сложные операции на множестве (SDIFF, SUNION, SINTER) являются O(N). Скорее всего, что заселение $userId была более дорогая операция, чем использование более длинного ключа.

Redis поставляется с эталонной утилитой под названием redis-benchmark, если вы измените тест " GET " в src/redis-benchmark.c так что они ключ просто "фу", вы можете запустить короткий ключевой тест после make install:

diff --git a/src/redis-benchmark.c b/src/redis-benchmark.c
--- a/src/redis-benchmark.c
+++ b/src/redis-benchmark.c
@@ -475,11 +475,11 @@
         benchmark("MSET (10 keys)",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"SET foo:rand:000000000000 %s",data);
+        len = redisFormatCommand(&cmd,"SET foo %s",data);
         benchmark("SET",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"GET foo:rand:000000000000");
+        len = redisFormatCommand(&cmd,"GET foo");
         benchmark("GET",cmd,len);
         free(cmd);

вот получить тестовую скорость для 3 последующих запусков короткого ключа "foo":

59880.24 requests per second
58139.53 requests per second
58479.53 requests per second

вот получить тестовую скорость после изменения источника снова и изменения ключа на "set-allBooksBelongToUser: 1234567890":

60240.96 requests per second
60606.06 requests per second
58479.53 requests per second

изменение ключа еще раз "ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumlorem:1234567890" дает это:

58479.53 requests per second
58139.53 requests per second
56179.77 requests per second

поэтому даже очень длинные клавиши не оказывают большого влияния на скорость redis. И это на GET, операция O(1). Больше сложные операции были бы еще менее чувствительны к этому.

Я думаю, что наличие ключей, которые четко определяют, какие значения они содержат, значительно перевешивает любую мизерную скорость, которую вы получите из сокращенных ключей.

если вы хотите взять это дальше, есть также -r [keyspacelen] параметр в утилите redis-benchmark, которая позволяет создавать случайные ключи (пока в них есть ':rand:'), вы можете просто увеличить размер префикса в тестовом коде до любого длина, которую вы хотели.

Redis любит держать все ключи в памяти. Чем больше средняя длина ключа, тем меньше его можно хранить в памяти. Так что да, длина ключа может значительно повлиять на производительность, но, вероятно, не значительно в том, как вы обеспокоены. То есть, с небольшим пространством ключей (например, тот, который легко помещается в памяти), 128-байтовый ключ и 16-байтовый ключ не будут работать резко по-разному.

Я не могу ответить на этот вопрос с уверенностью. Тем не менее, я могу задать несколько вопросов об этом и предложить некоторые замечания.

Я думаю, что очевидно, что очень длинные ключи (имена) и/или значения будут иметь влияние на производительность на общую производительность, если их вообще можно использовать. Эти воздействия могут быть в клиенте, по сети, или на сервере. Поэтому первый вопрос, который нужно вытащить из вашего будет:

как долго могут быть ключи и значения между редисом и вашими клиентами?

Поиск Рэдис,длина ключа и ограничения nets мне интересную запись в блоге на Redis против memcached, который может ответить на ваш вопрос. Первый ответ на эту запись в блоге, по-видимому, был написан Сальваторе Санфилипо, создателем Redis (в начале прошлой осени: 09/2010), предполагая, что более поздняя версия покажет значительно лучшие результаты. Два комментарии вниз от этого связывают нас с Сальваторе Redis / memcached Benchmark который был опубликован через несколько дней после того, как он ответил на оригинальный "blagger" (который, кажется, анонимен).

Это не отвечает на вопросы (как долго могут быть ключи и в каких точках есть обнаруживаемые воздействия на производительность). Тем не менее, это дает нам ключ к решению вопроса.

авторы обеих этих статей написали код и протестировали его ... и нарисовал график результаты.

мы могли бы сделать всевозможные догадки. Мы могли бы посмотреть на код и попытаться понять его.

однако наиболее значимым способом подхода к вопросу такого рода является написание некоторого кода для измерения одного предлагаемого шаблона использования ... и еще немного, чтобы проверить другой (например, диапазон длин клавиш от 8 символов до ... как долго вы хотели бы ... 8 килобайт?) ... и измерьте его.

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