Мой веб-сайт позволяет пользователям отправлять сообщения и подписываться на сообщения других людей. На главной странице сайта отображаются самые последние сообщения людей, на которых подписан пользователь. Количество людей, на которых может подписаться пользователь, не ограничено. Некоторые пользователи подписаны на тысячи других пользователей. Некоторые пользователи сделали более 15 000 сообщений.
Таблица базы данных сообщений организована следующим образом (для ясности несколько несущественных столбцов опущены):
id
author_id
post_content
date_added
У меня есть 2 рабочих решения, но я не уверен, что это лучший подход:
Решение 1:
- Получить список author_id, за которыми следит пользователь.
Запросите таблицу для сообщений, которые соответствуют любому из author_id:
SELECT id FROM posts WHERE author_id IN (12, 34, 56, 78, 90, ...) ORDER BY date_time DESC LIMIT 100;
- Кэшировать результат на N минут.
Это работает, но сканирует, когда пользователи подписаны на тысячи людей.
Решение 2:
- Получить список author_id, за которыми следит пользователь.
- Для каждого идентификатора автора получите кешированную ленту только их идентификаторов сообщений. (Этот фид используется на странице автора)
- Объедините все идентификаторы сообщений от всех этих авторов в один гигантский массив и отсортируйте их в порядке убывания (что работает, потому что каждое сообщение получает автоматически увеличивающийся идентификатор).
- Кэшировать и возвращать последние 100 идентификаторов сообщений;
Это работает, но иногда происходит сканирование, когда тысячи пользовательских фидов возвращаются и объединяются в массив из более чем 100 000 элементов. Это кажется излишним, когда все, о чем я забочусь, это самые последние 100 элементов. Кроме того, не все пользовательские каналы будут в кеше. Некоторые старые пользователи могут больше не использовать сайт, но за ними по-прежнему следуют новые пользователи, в результате чего фид старого пользователя будет заново запрашиваться (и затем кэшироваться).