Сохранить все уведомления пользователей в списке с помощью redis? - PullRequest
4 голосов
/ 07 марта 2012

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

Как реализовать поток активности в социальной сети

Как уже было сказано, каждое уведомление в системе, я нажимаю redis для каждого уведомленного пользователя (ключа), список (значение) идентификаторов из реляционной таблицы Activity:

key                         value
user:1:notifications        [25, 24, 23]
user:2:notifications        [24, 22, 17, 13, 5, 4]
...

Итак, моя таблица имеет только действия и пользователя, который вызывает это.Что происходит, так это то, что у меня есть только те пользователи, которые получили уведомления в redis и ничего в mysql ...

Мой вопрос заключается в том, что, если правильно сохранить это значение, то id будет бесконечным в redis или только для memcached обновлений иПериодически я обрезать этот список?

Ответы [ 2 ]

7 голосов
/ 07 марта 2012

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

Однако на практике Redis / Memcache и многие другие подобные реализации не предназначены для сохранения очень больших (или быстро растущих) наборов данных.

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

Самое простое решение для охвата всех баз - хранить данные об активности пользователей в Redis по мере их создания. Используйте Redis для отображения уведомлений и т. Д. Сохраняйте запущенный cron, который усекает все журналы активности старше предварительно определенного количества дней (или предварительно определенного количества операций на пользователя) и сохраняет их в обычной базе данных.

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

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

  • Хранить все действия в базе данных
  • Для любого пользователя, вошедшего в систему, извлекайте и сохраняйте все действия в Redis
  • При выходе удалить действия / уведомления этого пользователя из Redis
  • При добавлении действия требуется дополнительная логика, чтобы проверить, подключены ли затронутые пользователи к сети. В обоих случаях вам нужно добавить действие в базу данных, но если затронутый пользователь подключен к сети, добавьте его в свой хеш в Redis.
3 голосов
/ 07 марта 2012

Вам не нужно постоянно сохранять эти уведомления в Redis.Скорее наоборот: когда пользователь входит в систему, покажите все ваши уведомления в redis, а затем обрежьте список (или обрежьте его до фиксированной длины).

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