Подтвердить что ты не робот

Влияет ли длина имени на эффективность в Redis?

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

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

4b9b3361

Ответ 1

Ключ, который вы говорите об использовании, на самом деле не так долго.

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

Redis поставляется с тестовой утилитой под названием redis-benchmark, если вы измените тест GET в src/redis-benchmark.c, так что они будут просто "foo", вы можете запустить тест с короткими ключами после 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);

Здесь скорость теста GET для 3 последующих прогонов короткой клавиши "foo":

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

Здесь скорость теста GET после изменения источника снова и смены ключа на "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:" ), вы можете просто увеличить размер префикса в тестовом коде до любой требуемой длины.

Ответ 2

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

Ответ 3

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

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

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

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

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

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

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

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

Ответ 4

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