У меня есть новостной сайт с множеством тем. Могут быть миллионы пользователей, которые следят за темами. Я поддерживаю сортированный набор для каждого пользователя, чтобы загружать новости, относящиеся к темам, за которыми они следят. Когда статья будет добавлена или обновлена, я напишу эту статью в списки затронутых пользователей. В частности, псевдокод выглядит следующим образом:
if a article is added/updated
get all topics that the article belong (each article may belong to many topics)
for each topic: get all topic followers
update_user_news_list(userId, articleId)
Это java-код с jedis:
static final int LIMIT_BATCH = 1000;
static void addToUserHomeFeed(int index, Jedis jd) {
int range_limit = index + LIMIT_BATCH - 1;
Set<String> list = jd.zrange("Follower:Topic:Id", index, range_limit); // get list of followers
if (list.isEmpty()) return;
Iterator<String> it = list.iterator();
while (it.hasNext()) {
// update user list
}
addToUserHomeFeed(range_limit + 1, jd);
}
Проблема в том, что у моего сайта в настоящее время почти 1 миллион пользователей, некоторые популярные темы сопровождаются около 800000 пользователей, и иногда система выдает ошибки «переполнение буфера». Я что-то не так делаю или есть подходы получше? Я использую Redis 2.4