gpt4 book ai didi

redis - 如何清理redis中不活跃的玩家?

转载 作者:IT王子 更新时间:2023-10-29 06:01:25 25 4
gpt4 key购买 nike

我正在制作一款使用 Redis 存储游戏状态的游戏。它可以很好地跟踪位置和玩家,但我没有清理不活跃玩家的好方法。

每次玩家移动时(这是一个半慢速移动游戏。想想每秒 1-5 帧),我用新位置更新散列并删除旧位置键。

跟踪活跃玩家的最佳方式是什么?我想到了以下几点

  1. 将用户的一些 key 设置为过期。更新每一个心跳或 Action 。问题是位置存储在哈希中,因此如果用户 key 过期,玩家仍将位于同一位置。
  2. 相同,但使用 pub/sub 来监听过期并完成清理(似乎过于复杂)
  3. 将心跳存储在一个排序集中,每 X 秒运行一个进程来寻找老玩家。每次心跳更新分数。
  4. 彻底改造我存储位置的方式,以便我可以使用 expire.. 某种方式?

还有其他想法吗?

最佳答案

也许使用单独的 redis 数据结构(尽管是同一个数据库)来跟踪用户事件和用户位置。

例如,使用redis sets单独跟踪当前在线的用户:

[我的代码片段是在 python 中使用 redis-python 绑定(bind),并改编自 example app在 Flask(python 微框架)中; Armin Ronacher 的示例应用程序和框架。]

from redis import Redis as redis
from time import time

r1 = redis(db=1)

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

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)

因此,要让所有活跃用户联合所有事件 key (在本例中,即 10键,一个纯粹的任意数字),像这样:

def active_users(listOfKeys):
return r1.sunion(listOfKeys)

由于 TTL,这解决了您的“清理”问题——非事件用户不会出现在您的实时 key 中,因为它们不断循环——即,在事件用户中,只键入不持久的旧时间戳在这个例子中(但可能在到期前被 redis 写入永久存储)。无论如何,这会从您的事件 redis 数据库中清除非事件用户。

关于redis - 如何清理redis中不活跃的玩家?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9578420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com