Обновление относительного списка лидеров в реальном времени для каждого пользователя среди друзей

Я работал над функцией моего приложения для реализации таблицы лидеров - в основном, составление рейтинга пользователей в соответствии с их оценкой. Я в настоящее время отслеживаю счет на индивидуальной основе. Я думаю, что эта таблица лидеров должна быть относительной, а не абсолютной, то есть вместо того, чтобы иметь 10 лучших пользователей с наибольшим количеством баллов по всему сайту, это 10 лучших среди друзей в сети пользователя. Это кажется лучше, потому что у всех есть шанс быть # 1 в их сети, и есть форма дружеского соревнования для тех, кто интересуется такими вещами. Я уже храню счет для каждого пользователя, поэтому задача состоит в том, как эффективно вычислить рейтинг этого счета в режиме реального времени. Я использую Google App Engine, поэтому есть некоторые преимущества и ограничения (например, IN [массив]), запросы выполняют подзапрос для каждого элемента массива, а также ограничены 30 элементами на оператор

Например

1-й Джек 100

2-й Иоанн 50

Вот подходы, которые я предложил, но все они кажутся неэффективными, и я подумал, что это сообщество может предложить что-то более элегантное. Я чувствую, что любое решение, скорее всего, будет сделано с помощью cron, и я буду хранить ежедневный ранг и порядок списков для оптимизации операций чтения, но было бы здорово, если есть что-то более легкое и в реальном времени

Вытащите список всех пользователей сайта, упорядоченных по счету. Для каждого пользователя выберите своих друзей из этого списка и создайте новый рейтинг. Сохраните звание и порядок списков. Обновлять ежедневно. Минусы - если я получу много пользователей, это займет вечность

2а. Для каждого пользователя выберите своих друзей и для каждого друга выберите балл. Сортировать этот список. Сохраните звание и порядок списков. Обновлять ежедневно. Запишите последнюю позицию каждого пользователя, чтобы существующий список можно было использовать для повторного заказа на следующее обновление, чтобы сделать его более эффективным (может сэкономить время сортировки)

2b. То же, что и выше, за исключением того, что вычисляются только порядок ранга и списка для людей, чьи профили были просмотрены в последний день. Минусы - рейтинг актуален только для 2-го лица, просматривающего профиль

Ответы на вопрос(2)

Ваш ответ на вопрос