Структура zset в Redis имеет естественную функцию сортировки, которая очень подходит для функции ранжирования с большим количеством параллелизма. Диапазон таблицы лидеров определяется значением ключа, участники используются в качестве идентификатора сортировки, а баллы используются в качестве основы для сортировки. Функция списка лидеров Redis кажется простой и удобной в использовании, но она столкнулась со многими проблемами в практических приложениях, и эту функцию необходимо разработать с помощью соответствующих операций. Далее давайте уточним идеи дизайна таблицы лидеров.
1. Ключевой дизайн таблицы лидеров
Рейтинги обычно классифицируются по периодам времени, включая еженедельные, ежемесячные и годовые рейтинги. Таким образом, чтобы различать разные списки, их необходимо связать со временем, и данные сохраняются в соответствующем наборе zset по времени.
Например, годовой список можно определить по годам: ключ этого года — 2020, ключ прошлого года — 2019. Месяц определяется количеством месяцев. Ситуация с недельным списком немного особенная, ключ zset можно определить по неделе текущего года. Ключ, установленный таким образом, является количеством недель, и данные текущей недели могут быть подсчитаны.
Существует способ прямого получения номера недели в java
Примечание. Установить в понедельник в качестве первого дня недели, по умолчанию по умолчанию воскресенье.
Calendar cal = Calendar.getInstance();
//设置周一为一周的第一天
cal.setFirstDayOfWeek(Calenar.MONDAY);
cal.setTime(new Date());
int num = cal.get(Calenar.WEEK_OF_YEAR);
Однако, несмотря на то, что этот метод может быстро получить номер недели текущего дня, в некоторых списках лидеров необходимо просматривать данные за предыдущую неделю. Затем ключ недельного списка прошлой недели, то есть для получения номера недели предыдущей недели, нужно всего лишь вычесть единицу из номера недели этой недели.
В это время складывается особая ситуация: если сегодня первая неделя этого года, то ключ недельного списка предыдущей недели равен 0, что явно необоснованно. Итак, как с этим справиться?
На самом деле 0-я неделя этого года — это последняя неделя предыдущего года, вам нужно только получить номер последней недели предыдущего года. Итак, первый шагПереместить текущую дату вперед на 7 дней,Получить номер недели, которому принадлежит этот день, вы можете решить проблему получения номера недели в течение года.
2.Положение о согласовании
В реальной жизни таблицы лидеров, отсортированные по одному полю, очень редки. Это связано с тем, что в таблице лидеров может быть большое количество дублирующихся результатов, что делает невозможным оценку рейтинга, если результаты совпадают. Вот первый вопрос,такой же счетВ случае , какие данные будут ранжированы первыми?
Практика приносит истинные знания, откройте Redis и попробуйте. Вставьте 6 фрагментов данных, оценки одинаковы, но члены соответственно разные.2020001, 2020002, 2020003, aa,bb,ccэти 6. Используя zrange для сортировки, результат выглядит следующим образом
Догадка может быть связана с порядком символов.После проверки данных проверяется, что, когда значения очков одинаковы, они расположены в соответствии с порядком символов членов.
3. ZSET Multi-Field сортировка
zset можно сортировать только по количеству очков, то есть сортировке по одному полю.. Но во многих случаях существует более одного правила сортировки, например, рейтинговый список сравнивает не только количество успешных зачисток, но и продолжительность очистки, количество воскрешений и так далее. Это приводит к тому, что полей zset далеко не достаточно, так как же использовать несколько правил сортировки одновременно? Следующим шагом является использование обмана.
Так как поле сортировки всего одно, значения перегруппировываются по весу сопоставления. Преимущество численного сравнения достигается размещением значения с большим весом вверху числа комбинаций, что немного запутанно.Перейдем непосредственно к примеру.
Сцена выглядит следующим образом:Положительная последовательность времен таможенного оформления,Обратное число возрожденияиОбратное время первого таможенного оформленияСортировать.
Укажите значение:Очистить 5 раз,Воскресение 2иВремя первого таможенного оформления2020-06-09
Затем значение счета обрабатывается следующим образом:
- Количество зазоров имеет наибольший вес, поэтому 5 ставится вверху.
- Обратное количество воскрешений нужно свести на нет. Перед отрицанием нужно определить максимальное количество воскрешений, например 99 раз, тогда после отрицания получится 97
- Время таможенного оформления обращено вспять и должно быть обращено вспять. Сначала получите временную метку времени таможенного оформления и получите 1591632000000. Из-за ограничения двойных цифр удалите последние миллисекунды, то есть последние три цифры, чтобы получить 1591632000 из десяти цифр.В обратном порядке текущее значение 8408367999 необходимо вычесть из максимального числа 9999999999 (10 9 с).
Окончательный результат = '5'+'97'+'8408367999'= 5978408367999, всего 13 цифр. Очевидно, что при количестве растаможок меньше чем в 5 раз счет не должен превышать ****5978408367999 .
Следует отметить, что в этом методе поле score zset имеет тип double. В числовом типе типа double необходимо обратить внимание на точность целого числа и точность десятичной точки. Двойник может содержать не более 16 цифр.Если в составном поле сортировки есть время, число, используемое для сортировки других полей, составляет только 6 цифр.Это ограничение составной числовой сортировки.
4. Резервное копирование данных Redis
База данных Redis размещается в оперативной памяти и, хотя она работает быстро, также имеет стратегию сохраняемости для обеспечения высокой доступности. Однако для большого объема данных необходимо установить время истечения срока действия, чтобы освободить место в памяти, поэтому необходимо поместить данные в базу данных с помощью запланированных задач, чтобы обеспечить данные, и в то же время данные можно легко экспортировать. . Это также относительно просто реализовать, данные redis можно получить через текущую неделю, а базу можно выровнять.
Необходимо обратить внимание на временной узел запланированного задания. Для того, чтобы хранилище данных этой недели было наиболее полным, необходимо выполнить еще одну резервную копию во время первой синхронизации следующей недели. В это время вы можете установить флаг в Redis, чтобы судить о том, что есть флаг, что данные были синхронизированы на прошлой неделе перед каждым обновлением.