Мне нравится использовать вербальные имена в Redis, например set-allBooksBelongToUser:$userId
.
Это нормально или это влияет на производительность?
Мне нравится использовать вербальные имена в Redis, например set-allBooksBelongToUser:$userId
.
Это нормально или это влияет на производительность?
Ключ, который вы говорите об использовании, на самом деле не так долго.
Примерный ключ, который вы указываете для набора, устанавливает методы поиска 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:" ), вы можете просто увеличить размер префикса в тестовом коде до любой требуемой длины.
Redis любит держать все ключи в памяти. Чем длиннее средняя длина ключа, тем меньше может храниться в памяти. Так что да, длина ключа может значительно повлиять на производительность, но, вероятно, не так сильно, как вы. То есть, с небольшим пространством клавиш (например, с легкостью в памяти), 128-байтовый ключ и 16-байтовый ключ не будут выполняться по-разному.
Я не могу ответить на этот вопрос с какой-либо определенностью. Однако я могу задать некоторые вопросы и предложить некоторые наблюдения.
Я думаю, что очевидно, что чрезвычайно длинные ключи (имена) и/или значения будут иметь влияние производительности на общую производительность, если они могут быть использованы вообще. Эти воздействия могут быть в клиенте, по сети или на сервере. Итак, первый вопрос, который нужно вытащить из вас, будет следующим:
Как долго ключи и значения будут находиться между Redis и вашими клиентами?
Поиск по Redis, длина ключа и ограничения ограничивают меня интересной записью в блоге Redis vs. memcached, которая может начать отвечать на ваш вопрос. Первый ответ на эту запись в блоге, по-видимому, был написан Сальваторе Санфилипо, создателем Redis (начало прошлой осени: 09/2010), предполагающим, что более новая версия будет показывать значительно лучшие результаты. Два комментария по этому поводу связывали нас с Salvatore Redis/memcached Benchmark, который был опубликован через несколько дней после того, как он ответил на оригинальный "blagger" ( который кажется анонимным).
Это не отвечает на вопросы (как долго ключи могут быть и в каких точках обнаруживаются удары по производительности). Тем не менее, это дает нам ключ к подходу к вопросу.
Авторы обеих этих статей написали код и протестировали его... и нарисовали результаты.
Мы могли бы делать всевозможные догадки. Мы могли бы посмотреть на код и попытаться обосновать его.
Однако наиболее значимым способом подхода к подобному вопросу является написать некоторый код для измерения одного предложенного шаблона использования... и еще немного для проверки другого (например, диапазон длин ключей от 8 символов до... как долго вы хотели бы... 8 килобайт?)... и мера это.
Я не думаю, что длина имени переменной будет влиять на производительность, переменная будет занимать то же место, что и любая переменная для этого типа данных, если вы не превысите максимальную длину имени.