当前位置: 首页 > 面试题库 >

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

阳博赡
2023-03-14
问题内容

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

每次玩家移动时(这是一种半慢速移动的游戏。以每秒1-5帧的速度思考),我将使用新位置更新哈希值并删除旧的位置键。

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

  1. 为用户设置一些密钥以使其过期。更新每个心跳或动作。问题在于位置存储在哈希中,因此如果用户密钥过期,则播放器仍将位于同一位置。
  2. 相同,但是使用pub / sub来监听到期并完成清理(似乎过于复杂)
  3. 将心跳存储在已排序的集合中,每隔X秒运行一次流程以查找旧玩家。每次心跳更新分数。
  4. 彻底改变我存储位置的方式,以便可以使用过期。

还有其他想法吗?


问题答案:

也许使用 单独的 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数据库中清除不活动的用户。



 类似资料:
  • 我有两个 ActiveMQ 代理(A 和 B),它们被配置为存储转发网络。当代理 B 上连接了使用者并且创建者将消息发送到 A 时,它们可以完美地将消息从 A 转发到 B。问题在于,当使用者被杀死并重新连接到 A 时,B 上排队的消息(它们是从 A 转发的)不会转发回使用者连接到的 A。即使我向 B 发送新消息,所有消息都卡在 B 上,直到我重新启动代理。我尝试在代理网络连接器上设置网络TTL=“

  • 问题内容: 我在服务器中使用,因此客户端可以从服务器获取通知。 但是,似乎客户端连接到服务器后,如果客户端和服务器之间没有任何数据传输,服务器将在处返回EOF错误,这看起来像是一种超时机制。 我在Google中搜索过,看来websocket协议具有 乒乓 心跳来维持连接,我想问一下是否支持此ping协议? 如果要保持客户端与服务器之间的连接有效,该怎么办? 问题答案: 直到2013年,go.net

  • 功能介绍 获取本APP的活跃用户报告数据 接口 https://openapi.baidu.com/rest/2.0/mtj/svc/app/getDataByKey 请求参数 此处仅列本接口特有参数,公共参数请参考报告级API说明 获取表格数据 参数名 参数类型 是否必须 描述 method string 是 activitydegree/a ; activitydegree/f metric

  • 目前准备用redis实现分布式限流策略, 抛开那些redis插件,我觉得zset实现理论上可行, 具体逻辑可以是这样: 抽象限流逻辑: 针对某个action,需要在一段时间(即为窗口),只能容许N个操作 redis伪代码 问题: 假设某个行为有大量的不同样本或者不同实例在调用, 也就是key不一样, 假设有百万以上,但是每个key的行为发生次数有限,例如就一次, 这个时候就会出现很大冷数据 处理该

  • 4.留存活跃 一、留存活跃 留存可以用作评价用户使用产品的粘性,是非常重要的一个指标。及策提供新增留存和活跃两种评估角度。 二、功能介绍 留存: 可查看今日之前某渠道、推广活动分日、周、月查看1日留存、2日留存……7日留存、14日留存、30日留存占比以及留存激活设备数; 数据导出:根据所选时间范围,CSV格式,命名方式为:留存数据 活跃: 可查看今日之前某渠道、推广活动DAU、MAU; 数据导出:

  • 本文向大家介绍利用Redis统计网站在线活跃用户的方法,包括了利用Redis统计网站在线活跃用户的方法的使用技巧和注意事项,需要的朋友参考一下 前言 在工作中我们经常遇到这样的需求,要对某个在线网站的活跃用户数量进行统计。这里我们以redis为例,说明一下其实现的过程。 实现方法 在Redis中存在bitmap这种数据类型,这种数据类型是建立在string数据类型之上的。这里,我们主要用到setb