Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何清理redis中的非活动玩家?_Redis - Fatal编程技术网

如何清理redis中的非活动玩家?

如何清理redis中的非活动玩家?,redis,Redis,我正在制作一个使用redis存储游戏状态的游戏。它可以很好地跟踪位置和玩家,但是我没有一个很好的方法来清理不活跃的玩家 每当一个玩家移动(这是一个半慢速移动的游戏。想想每秒1-5帧),我就会用新的位置更新一个散列,并删除旧的位置键 跟踪活跃玩家的最佳方式是什么?我想到了以下几点 将用户上的某些密钥设置为过期。更新每个心跳或移动。问题是位置存储在散列中,所以如果用户密钥过期,播放器仍将在同一位置 相同,但使用pub/sub来监听过期消息并完成清理(似乎过于复杂) 将心跳存储在已排序的集合中,每X秒

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

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

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

  • 将用户上的某些密钥设置为过期。更新每个心跳或移动。问题是位置存储在散列中,所以如果用户密钥过期,播放器仍将在同一位置
  • 相同,但使用pub/sub来监听过期消息并完成清理(似乎过于复杂)
  • 将心跳存储在已排序的集合中,每X秒运行一次进程以查找旧玩家。每次心跳时更新分数
  • 彻底改变我存储位置的方式,以便使用expire。。不知怎么的
  • 还有其他想法吗

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

    例如,使用redis集合分别跟踪当前在线的用户:

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

    from redis import Redis as redis
    from time import time
    
    r1 = redis(db=1)
    
    调用下面的函数时,它将基于当前unix时间(以分钟为单位)创建一个密钥 然后将用户添加到具有该密钥的集合中。我想你会想的 将到期时间设置为10分钟,这样在任何给定时间,您都有10个密钥处于活动状态 (每分钟一次)

    因此,要获取所有活动用户,只需联合所有活动密钥(在本例中为10) 键(一个纯粹的任意数字),如下所示:

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

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

    谢谢!澄清一下:我必须为非活动用户清理我的位置信息。我真的需要知道非活动项,这样我就可以从位置哈希中删除它们的位置。@seanclarkhes:当然;我想到的是,一旦你获得了活动用户(例如,从函数“active_users”)然后检查你的位置散列中是否存在这些键。逻辑是“如果不输入[hash],则调用该用户的位置hash上的“hset”,传递非活动播放器的位置值。
    def active_users(listOfKeys):
        return r1.sunion(listOfKeys)