Поскольку вы храните имена исполнителей в нижнем регистре и ищете полное имя исполнителя, это должно работать для вас.Я изложу команды Redis, вы должны легко найти соответствующий вызов API в вашем клиенте (сначала используйте redis-cli
, это прояснит ситуацию для вас).
Я предполагаю, что ваша таблица Artists
имеет 3записи: «Правление Киндо», «Театр снов» и «ACT», соответствующие идентификаторы 1, 2, 3.
Основная идея - загрузить эту таблицу в отсортированный набор . оценка каждого участника будет идентификатором исполнителя, а строка члена будет именем исполнителя:
Фаза загрузки, заполнение отсортированного набора всеми исполнителями (обратите внимание настрочные буквы):
ZADD artists 1 "the reign of kindo"
ZADD artists 2 "dream theater"
ZADD artists 3 "a.c.t"
Теперь я буду запрашивать Redis для первых двух полос.Идея состоит в том, чтобы создать на этот раз временный отсортированный набор (query:10
), который будет пересекаться с отсортированным набором artists
.
Почему бы просто не использовать query
какключ?Я присваиваю каждому запросу (произвольно) id
, чтобы не возникало коллизий между одновременными поисками пользователей!Кроме того, мы можем обратиться к id
позже при кэшировании набора результатов за период (подробнее об этом ниже).
Рекомендуется использовать :
в качестве разделителясоглашение (смотрите здесь ).
Фаза запроса, заполняющая отсортированный запрос.
ZADD query:10 0 "the reign of kindo"
ZADD query:10 0 "dream theater"
ZINTERSTORE result_query:10 2 artists query:10 WEIGHTS 1 0
EXPIRE result_query:10 600
Оценка для отсортированного запросане имеет значения, поэтому может быть 0
.
С ZINTERSTORE мы храним в result_query:10
пересечение 2
ключей, artists
и query:10
.Но есть подвох!Как оценки из обоих ключей объединяются в окончательный отсортированный набор?
Ответ: Redis по умолчанию суммы их.
Теперь мы можем использовать атрибут WEIGHTS
для ноль баллы, которые мы не хотим.Так что WEIGHTS 1 0
говорит, что будет суммироваться только счет за artists
.
Теперь у нас есть подходящие исполнители в result_query:10
, что EXPIRE делает его длиться 10 минут.Вы можете найти умный способ использовать этот кэш =)
Получение набора результатов
Таким образом, выполнив все вышеперечисленное, вы можете получить желаемый результат с помощью ZRANGE:
redis> zrange result_query:10 0 -1 withscores
1) "the reign of kindo"
2) "1"
3) "dream theater"
4) "2"
Интервал 0 -1
означает получить всех членов , а атрибут withscores
дает ZRANGE возвращает идентификаторы (оценки) каждогочлен вместе со своими строками.
Надеюсь, что все имеет смысл.Это только верхушка айсберга для Редиса.Хороший бенчмаркинг и до встречи!