首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何清除红宝石中不活跃的玩家?

如何清除红宝石中不活跃的玩家?
EN

Stack Overflow用户
提问于 2012-03-06 05:34:56
回答 1查看 1.9K关注 0票数 3

我正在制作一个使用redis存储游戏状态的游戏。它很好地跟踪位置和球员,但我没有一个很好的方法来清理不活跃的球员。

每次玩家移动(这是一个半慢动作的游戏。)考虑每秒1-5帧),我用新的位置更新哈希并删除旧的位置键。

什么是最好的方式来跟踪活跃的球员?我想到了以下几点

  1. 将用户的某些密钥设置为过期。更新每一个心跳或移动。问题是这些位置存储在散列中,因此如果用户密钥过期,播放机仍将处于相同的位置。
  2. 同样,但使用pub/sub监听过期并完成清理(似乎过于复杂)
  3. 将心跳存储在排序集中,让进程每X秒运行一次,以查找老玩家。每一次心跳都更新得分。
  4. 彻底改变我存储位置的方式,这样我就可以使用过期..。不知何故?

还有其他想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-06 06:44:52

也许使用单独的redis数据结构(尽管是相同的数据库)来跟踪用户活动和用户位置。

例如,使用redis单独跟踪当前在线用户设置

[我的代码片段在python中,使用redis-python绑定,并从示例应用程序 (python )中改编;示例应用程序和框架都是由Armin编写的。]

代码语言:javascript
复制
from redis import Redis as redis
from time import time

r1 = redis(db=1)

当调用下面的函数时,它根据当前unix时间(分钟)创建一个键,然后将一个用户添加到拥有该键的集合中。我可以想象,您会希望将到期时间设置为10分钟,因此在任何给定的时间,您都有10个活键(每分钟一个)。

代码语言:javascript
复制
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个键,一个纯粹的任意数字),如下所示:

代码语言:javascript
复制
def active_users(listOfKeys):
    return r1.sunion(listOfKeys)

这解决了您的“清理”问题,因为TTL--不活动的用户不会出现在您的活动密钥中,因为他们不断地循环使用--也就是说,在活动用户中,只需使用旧的时间戳(在此示例中不持久化(但可能是在到期前由redis写到永久存储)。无论如何,这将清除活动redis db中的非活动用户。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9578420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档