1. Введение
Раньше я писал блог, объясняя пять структур данных Redis и их общие команды, В то время некоторые читатели отмечали, что хотят понять сценарии использования этих пяти структур данных, но у меня никогда не было времени их написать.
Так совпало, что во время собеседования в марте интервьюер сначала спросил меня, какие структуры данных есть в Redis, а после того, как я закончил говорить, интервьюер задал мне следующие вопросы:
Как использовать Redis для ранжирования шагов WeChat?
Я считаю, что многие друзья знают, что они могут использоватьRedis
упорядоченный наборZSET
Чтобы достичь этого, этот блог основан на этом вопросе интервью, чтобы объяснить следующийZSET
Сценарий использования и общая идея реализации ступенчатого рейтинга WeChat.
2. Сценарии использования ZSET
ZSET
Классический сценарий использования — реализация рейтингового списка.Вот несколько распространенных примеров, таких как Baidu Hot List, Weibo Hot Search List и Wechat Step Ranking List, которые мы используем каждый день:
Идеи реализации трех сценариев в основном одинаковы.Далее давайте возьмем список ранжирования шагов WeChat в качестве примера, чтобы понять, как использовать Redis.ZSET
, чтобы реализовать список ранжирования шагов WeChat.
3. Общая идея реализации списка ступенчатого ранжирования WeChat
**Примечание.** Эта статья посвящена Redis.ZSET
Поэтому мы анализируем только общие идеи реализации списка шагов ранжирования WeChat, а фактическая реализация определенно сложнее, чем анализ в статье.
Во-первых, давайте проанализируем потребности списка ранжирования шагов WeChat:
- Таблица лидеров основана на дате, и можно просмотреть таблицу лидеров исторических дат.
- Таблица лидеров может отображать шаги не всех друзей.Например, у меня 349 друзей в WeChat, но таблица лидеров никогда не отображала так много.Предполагается, что максимум отображаются только друзья с верхними 200 шагами.
- Количество шагов обновляется асинхронно, поэтому после синхронизации количества шагов время от времени таблица лидеров будет меняться.
- В рейтинге аватарки друзей и никнеймы WeChat можно понимать как неизменные (вероятность изменения мала, как и заголовок и URL в списке горячего поиска), но количество шагов и количество лайков переменное
Основываясь на вышеуказанных требованиях к анализу, общие идеи реализации заключаются в следующем:
-
Использование Redis
ZSET
структура данных -
При настройке ключа на основе идентификатора и даты WeChat, например, мой WeChat — zwwhnly, а сегодняшняя дата — 01.06.2020, тогда ключ может быть оформлен как: StepNumberRanking:zwwhnly:20200601
-
При установке значения псевдоним друга используется в качестве члена-члена, а количество шагов друга используется в качестве оценки, как показано ниже:
-
Использование Redis
HASH
Структура данных, где ключ — это ключ на шаге 2 + участник на шаге 3, а значение хранит аватар друга, псевдоним, количество шагов и количество лайков, как показано ниже: -
При получении рейтинга шагов WeChat он делится на следующие два этапа:
1) Сначала запросите псевдоним друга в списке ранжирования шагов WeChat, то есть запросите значение StepNumberRanking:zwwhnly:20200601.
2) По полученному нику друга запросить информацию о номере шага друга, то есть запросить значение StepNumberRanking:zwwhnly:20200601:yst
4. Используемые команды Redis
Общие идеи реализации проанализированы выше, далее мы объясним используемые команды Redis.
4.1 ZADD
Выполните следующую команду, чтобы инициализировать ранжирование количества шагов WeChat.В качестве примера возьмите 9 друзей на картинке выше и инициализируйте ее дважды:
ZADD StepNumberRanking:zwwhnly:20200602 25452 yst 23683 zq 23599 ljx 20391 yyq 19628 XxZz
ZADD StepNumberRanking:zwwhnly:20200602 18261 lxx 16636 zcc 16555 clc 16098 fl
Эффект после выполнения показан на следующем рисунке:
Видно, что по умолчанию баллы расположены в положительном порядке, то есть количество шагов расположено от меньшего к большему.
4.2 HMSET
Поскольку псевдоним, аватар, количество шагов и количество лайков должны отображаться при отображении списка ранжирования шагов, вы можете использоватьHASH
структура данных для хранения, то нам нужно использоватьHMSET
Заказ:
Эффект после выполнения показан на следующем рисунке:
4.3 ZINCRBY
Время от времени количество шагов друга будет обновляться, и вы можете использовать его в это время.ZINCRBY
команда для обновления количества шагов друга. Предположим, мы обновляем только шаги первых 2 друзей по количеству шагов и увеличиваем их количество шагов на 10, мы можем выполнить следующую команду:
ZINCRBY StepNumberRanking:zwwhnly:20200602 10 yst
ZINCRBY StepNumberRanking:zwwhnly:20200602 10 zq
Эффект после выполнения показан на следующем рисунке:
После обновления количества шагов в таблице лидеров не забудьте выполнитьHMSET
Команда для обновления счетчика шагов друга:
4.4 HINCRBY
Когда нам нравятся наши друзья в таблице лидеров, мы можем использоватьHINCRBY
добавьте 1 к likeNum на рисунке выше:
HINCRBY StepNumberRanking:zwwhnly:20200602:zq likeNum 1
4.5 ZRANGE
После того, как все данные будут на месте, останется только запросить, мы можем использоватьZRANGE
Команда для получения информации о друзьях в таблице лидеров:
ZRANGE StepNumberRanking:zwwhnly:20200602 0 -1
Видно, что запрошенная информация о друзьях отсортирована по количеству шагов от меньшего к большему, а список ранжирования должен быть отсортирован по количеству шагов от большего к меньшему, в котором используются следующиеZREVRANGE
Заказ.
4.6 ZREVRANGE
ZREVRANGE
команда иZRANGE
Команды похожи, но в обратном порядке по счету, что как раз соответствует сцене таблицы лидеров.
Например, выполните команду:
ZREVRANGE StepNumberRanking:zwwhnly:20200602 0 -1 WITHSCORES
Видно, что запрошенная информация о друзьях отсортирована в порядке убывания шагов, именно в таком порядке она должна отображаться в таблице лидеров.
Однако список ранжирования обычно не отображает все данные. Здесь у нас относительно мало данных. Если мы подружимся только с верхними 5 шагами, мы можем выполнить следующую команду:
ZREVRANGE StepNumberRanking:zwwhnly:20200602 0 4 WITHSCORES
Если вы хотите получить топ200, измените 4 выше на 199.
4.7 HGETALL
После получения информации о друзьях в таблице лидеров последний шаг — получить шаги, лайки, аватары и прозвища этих друзей, что мы и использовали ранее.HASH
Информация, хранящаяся в структуре данных, на данный момент мы можем использоватьHGETALL
команда следующим образом:
HGETALL StepNumberRanking:zwwhnly:20200602:yst
Если вы не очень хорошо знакомы с этими командами, вы можете прочитать один из моих предыдущих постов в блоге:Серия Redis (2): 5 структур данных Redis и их общие команды.
5. Резюме
РедисZSET
Структура данных очень удобна для использования в сценариях ранжирования, таких как горячий поиск Baidu, список горячего поиска Weibo, рейтинговый список игр, рейтинговый список подсчета шагов WeChat, интервьюер определенно не будет спрашивать вас, какие команды есть у ZSET, и детали каждой команда И так далее, но если вы спросите, как использовать Redis для реализации списка ранжирования шагов WeChat, вы можете узнать, насколько хорошо вы владеете структурой данных Redis.
Поэтому очень важно изучить основы пяти структур данных Redis, но еще важнее знать, как использовать эти структуры данных и какие сценарии наиболее подходят для каждой структуры данных.
Примечание. Если вы считаете, что в этом блоге есть какие-либо ошибки или лучшие предложения, оставьте сообщение, я слежу и вовремя исправлю содержание блога!
Статья будет постоянно обновляться, пожалуйста, обратите внимание на общедоступный аккаунт WeChat «Shencheng Stranger», чтобы прочитать ее впервые!