我正在制作一个使用redis存储游戏状态的游戏。它很好地跟踪位置和球员,但我没有一个很好的方法来清理不活跃的球员。
每次玩家移动(这是一个半慢动作的游戏。)考虑每秒1-5帧),我用新的位置更新哈希并删除旧的位置键。
什么是最好的方式来跟踪活跃的球员?我想到了以下几点
还有其他想法吗?
发布于 2012-03-06 06:44:52
也许使用单独的redis数据结构(尽管是相同的数据库)来跟踪用户活动和用户位置。
例如,使用redis单独跟踪当前在线用户设置。
[我的代码片段在python中,使用redis-python绑定,并从示例应用程序 (python )中改编;示例应用程序和框架都是由Armin编写的。]
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)因此,要使所有活动用户只需联合所有活动键(在本例中是10个键,一个纯粹的任意数字),如下所示:
def active_users(listOfKeys):
return r1.sunion(listOfKeys)这解决了您的“清理”问题,因为TTL--不活动的用户不会出现在您的活动密钥中,因为他们不断地循环使用--也就是说,在活动用户中,只需使用旧的时间戳(在此示例中不持久化(但可能是在到期前由redis写到永久存储)。无论如何,这将清除活动redis db中的非活动用户。
https://stackoverflow.com/questions/9578420
复制相似问题