我正在制作一个使用Redis存储游戏状态的游戏。它可以很好地跟踪位置和玩家,但是我没有清除闲置玩家的好方法。
每次玩家移动时(这是一种半慢速移动的游戏。以每秒1-5帧的速度思考),我将使用新位置更新哈希值并删除旧的位置键。
跟踪活跃玩家的最佳方法是什么?我想到了以下
还有其他想法吗?
也许使用 单独的 redis数据结构(尽管使用相同的数据库)来跟踪用户活动和用户位置。
例如,使用 redis集 分别跟踪当前在线的用户:
[我的代码段是在Python中使用redis-python绑定,并改编自Flask(python micro- framework)中的示例应用;示例应用程序和框架均由Armin Ronacher撰写。]
from redis import Redis as redis from time import time r1 = redis(db=1)
当调用下面的函数时,它将基于当前的UNIX时间(以分钟为单位)创建密钥,然后将用户添加到具有该密钥的集合中。我想您会希望将到期时间设置为10分钟,所以在任何给定时间,您都有10个有效键(每分钟1个)。
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)
因此,要使所有活动用户只需 合并 所有活动键(在此示例中,即为10个键,一个纯粹的任意数字),如下所示:
def active_users(listOfKeys): return r1.sunion(listOfKeys)
这通过TTL解决了您的“清理”问题- 闲置的用户不会出现在您的活动键中,因为它们不断循环使用-即,在活动的用户中,它们仅使用旧时间戳记,在此示例中不存在(但也许会在到期前通过redis写入永久性存储)。无论如何,这将从活动的redis数据库中清除不活动的用户。