Возможно использовать отдельные структуры данных redis (хотя и в той же базе данных) для отслеживания активности пользователей
и местоположение пользователя.
Например, отслеживать пользователей, которые в настоящее время онлайн отдельно, используя redis sets :
[мой фрагмент кода в python использует привязки redis-python и адаптирован из примера приложения в Flask (микро-фреймворк python); Пример приложения и фреймворк от Армина Ронахера.]
from redis import Redis as redis
from time import time
r1 = redis(db=1)
при вызове указанной ниже функции создается ключ на основе текущего времени Unix в минутах.
а затем добавляет пользователя в набор, имеющий этот ключ. Я полагаю, вы бы хотели
установите срок действия, скажем, 10 минут, так что в любой момент времени у вас есть 10 живых ключей
(по одному в минуту).
def record_online(player_id):
current_time = int(time.time())
expires = now + 600 # 10 minutes TTL
k1 = "playersOnline:{0}".format(now//60)
r1.sadd(k1, player_id)
r1.expire(k1, expires)
Таким образом, чтобы получить всех активных пользователей, просто union всех живых ключей (в данном примере это 10
ключи, чисто произвольное число), вот так:
def active_users(listOfKeys):
return r1.sunion(listOfKeys)
Это решает ваши проблемы с «очисткой» из-за TTL - неактивные пользователи не будут появляться в ваших живых ключах, потому что они постоянно перезаписываются - то есть, у активных пользователей используются только старые метки времени, которые не сохраняются в этом примере (но, возможно, записываются в постоянное хранилище с помощью redis до истечения срока действия). В любом случае, это удаляет неактивных пользователей из вашей активной базы данных redis.