Redis ВЫБЕРИТЕ производительность - PullRequest
4 голосов
/ 10 января 2012

Я использую redis с несколькими базами данных (которые я переключаю командой SELECT).

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

Я хотел бы спросить, было ли это правильное решение с заботой о производительности?

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

for data in array {
  redis_select(0)
  k = redis_get(...)
  redis_select(1)
  k2 = redis_get(k)
}

или

redis_select(0)
k = []
for data in array {
  k[x] = redis_get(...)
}

redis_select(1)
k2 = []
for data in array {
  k2[x] = redis_get(k[x])
}

1 Ответ

8 голосов
/ 11 января 2012

Вы можете использовать концепцию базы данных Redis для разделения данных. Это полностью поддерживается в текущей версии и будет поддерживаться в будущих.

Теперь, это не рекомендуемое решение для изоляции данных. Лучше вместо этого запустить несколько экземпляров Redis. Накладные расходы экземпляра очень малы (менее 1 МБ), поэтому вы можете запустить несколько из них на любом компьютере. Он более масштабируемый (рабочая нагрузка будет распределена на несколько ядер ЦП, а не на одно). Он более гибкий (вы можете использовать разные параметры конфигурации для набора данных или разные файлы дампа). Ваш клиент просто должен открыть одно соединение для каждого экземпляра, чтобы получить доступ к различным наборам данных.

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

Используя ваши примеры, первое предложение будет генерировать 4 команды на элемент массива. Второе предложение будет генерировать только 2 команды на элемент, так что оно намного эффективнее. Если количество элементов является значительным, во втором предложении стоимость SELECT незначительна, а в первом - нет.

Если вы планируете выполнять итерации на массивах для запуска команд Redis, рассмотрите возможность использования команд с переменными параметрами (например, MGET / MSET) или конвейерной передачи (если ваш клиент поддерживает это), чтобы уменьшить общее количество циклических обращений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...