Использовать отсортированный набор для системы уведомлений

Я использую Redis sorted sets для сохранения пользовательских уведомлений. Но поскольку я никогда не делал систему уведомлений, я спрашиваю о своей логике.

Мне нужно сохранить 4 вещи для каждого уведомления.

  • post_id
  • post_type - А/Б
  • видимый - Да/Нет
  • проверено - да/нет

Мой вопрос: как я могу хранить этот тип структуры в отсортированных наборах?

ZADD users_notifications:1 10 1_A_Y_Y 
ZADD users_notifications:1 20 2_A_Y_N
....

Есть ли лучший способ сделать такие вещи в Redis? В приведенном выше случае я сохраняю четыре вещи в каждом элементе, и мне нужно разделить символ подчеркивания на языке сервера.


person anvd    schedule 24.04.2015    source источник


Ответы (1)


Это действительно зависит от того, как вам нужно запрашивать данные.

Самый распространенный способ решить эту проблему — использовать отсортированный набор для порядка и хэш для каждого объекта.

So:

ZADD notifications:<user-id> <timestamp> <post-id>
HMSET notifications:<user-id>:<post-id> type <type> visible <visible> checked <checked>

Вы должны использовать ZRANGE для получения последних уведомлений по порядку, а затем конвейерный вызов HMGET, чтобы получить атрибуты для каждого объекта.

Как я уже упоминал, это зависит от того, как вам нужно получить доступ к данным. Если, например, вы всегда показываете видимые и неотмеченные уведомления пользователю, то вы, вероятно, захотите сохранить эти идентификаторы в другом отсортированном наборе, чтобы вам не приходилось запрашивать статус.

Предполагая, что у вас есть такой отсортированный набор, когда пользователь отклоняет уведомление, которое вы должны сделать:

HSET notifications:<user-id>:<post-id> visible 0
ZREM notifications:<user-id>:visible <post-id>
person djanowski    schedule 24.04.2015
comment
Можем ли мы объединить zadd и hmset в lua вместо того, чтобы объединять их в транзакцию, будет ли это работать лучше? - person PirateApp; 09.05.2018