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

2024-04-08

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

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

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

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

还有其他想法吗?


也许使用separateRedis 数据结构(尽管相同的数据库)用于跟踪用户活动 和用户位置。

例如,使用以下命令单独跟踪当前在线的用户Redis 集:

[我的代码片段是使用 redis-python 绑定的 python 代码,并改编自示例应用程序 http://flask.pocoo.org/snippets/71/在 Flask(python 微框架)中;示例应用程序和框架均由 Armin Ronacher 编写。]

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)

所以为了让所有活跃用户union所有活动键(在本例中为 10 键,纯粹任意的数字),如下所示:

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

这解决了由于 TTL 而导致的“清理”问题——非活动用户不会出现在您的实时密钥中,因为它们不断循环——即,活动用户中仅键入旧时间戳,而旧时间戳在本例中不会持续存在(但也许在过期之前由 Redis 写入永久存储)。无论如何,这都会从活动的 redis 数据库中清除不活动的用户。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何清理redis中不活跃的玩家? 的相关文章

  • 如何在实时添加对象时从 Redis 中弹出对象?

    我想让 Node js 进程运行 因为它正在检查 Redis 服务器是否有任何新的弹出内容 另一个进程将偶尔进行推送 而 Node 进程将尝试弹出任何进来的内容 Node 进程将保持运行 有人能给我指出一个好的方向吗 我正在尝试找出如何监听
  • 使用 sidekiq 处理两个独立的 Redis 实例?

    下午好 我有两个独立但相关的应用程序 他们都应该有自己的后台队列 阅读 单独的 Sidekiq 和 Redis 进程 然而 我希望偶尔能够将工作推给app2的队列来自app1 从简单的队列 推送的角度来看 如果app1没有现有的 Sidek
  • 如何清理redis中不活跃的玩家?

    我正在制作一个使用 redis 来存储游戏状态的游戏 它可以很好地跟踪位置和玩家 但我没有一个好的方法来清理不活跃的玩家 每当玩家移动时 这是一个半慢速移动游戏 想想每秒 1 5 帧 我就会用新位置更新哈希并删除旧位置键 跟踪活跃玩家的最佳
  • Laravel - 缓存 Eloquent 并频繁更新

    是否可以对经常修改的对象使用缓存 例如 假设我们有一个 BlogPost 对象 并且有一个经常更改的 num of views 列 以及其他列 是否可以更新缓存和数据库中的 num of views 字段 而不破坏缓存对象并重新创建它 我可
  • 如何从 python 将无穷大传递给 redis?

    我正在使用 redis py 并希望将 inf 和 inf 与 ZRANGEBYSCORE 一起使用 我尝试使用 inf 的字符串和浮点来执行此操作 但它们返回一个空集 我怎样才能做到这一点 EDIT 我尝试执行以下命令 redis Str
  • Redis 块推送直到列表有空位

    我正在寻找类似的东西BLPUSH该命令将阻塞 直到列表的长度低于指定值max size 目的是防止生产者运行速度快于消费者时列表无限增长 功能与 python 非常相似Queue put https docs python org 3 li
  • 仅当尚未设置时才进行原子设置

    仅当尚未在 Redis 中设置时 是否有办法执行原子设置 具体来说 我正在创建一个像 myapp user user email 这样的用户 并且希望 Redis 在 user email 已被占用时返回错误 而不是默默地替换旧值 比如声明
  • 如何在多个Lua State(多线程)之间传递数据?

    我在中启动Redis连接池redis lua 通过从 C 调用 我得到了redis lua state 此 Lua 状态全局启动一次 仅在其他线程中启动get从中 当有一个 HTTP 请求 工作线程 时 我需要从redis lua stat
  • 如何设置 Celery 以通过 ssl 与 Azure Redis 实例对话

    使用 的伟大答案 如何在microsoft azure上的django项目中配置celery redis https stackoverflow com questions 39616701 how to configure celery
  • 是否有可嵌入的 Java 替代 Redis?

    根据这个线程 https stackoverflow com questions 3047010 best redis library for java 如果我想从Java中使用Redis Jedis是最好的选择 然而 我想知道是否有任何库
  • Docker-compose Predis 不通过 PHP 连接

    我正在尝试使用 docker compose 将 PHP 与 redis 连接 docker compose yml version 2 services redis image redis 3 2 2 php image company
  • Spring Data Redis - Lettuce连接池设置

    尝试在 spring data redis 环境中设置 Lettuce 连接池 下面是代码 Bean LettuceConnectionFactory redisConnectionFactory GenericObjectPoolConf
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • 如何批量删除Redis中数十万个带有特殊字符的key

    我们有一个包含数十万个 Redis 键的列表 其中包含各种特殊字符 我们希望批量删除它们 对于这个问题上的类似问题 有一些很好的答案 如何使用 Redis 自动删除与模式匹配的键 https stackoverflow com questi
  • Caffeine Expiry 中如何设置多个过期标准?

    我正在使用 Caffeine v2 8 5 我想创建一个具有可变到期时间的缓存 基于 值的创建 更新以及 该值的最后一次访问 读取 无论先发生什么都应该触发该条目的删除 缓存将成为三层值解析的一部分 The key is present i
  • 如何测试我的 Redis 缓存是否正常工作?

    我已经安装了 django redis cache 和 redis py 我遵循了 Django 的缓存文档 据我所知 以下设置就是我所需要的 但我如何判断它是否正常工作 设置 py CACHES default BACKEND redis
  • 如何将node.js管道传输到redis?

    我有很多数据要插入 SET INCR 到redis DB 所以我正在寻找pipeline http redis io topics pipelining 质量插入 http redis io topics mass insert通过node
  • 使用 Redis 命令 incr 和 expire 时的竞争条件

    根据redis文档 http redis io commands incr http redis io commands incr 在段落模式 速率限制器 2 较短的版本代码 value INCR ip IF value 1 THEN EX
  • 如何在Redis中进行持久化存储?

    关闭redis服务器后 使用set存储的值被破坏 在这里我找到了使用持久性存储的方法 有人帮助我 如何使用javascript实现这一点 我想将客户端的一些值存储在 redis 数据库中 并且必须在其他客户端中使用该值 您需要配置 Redi
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis

随机推荐

  • 如何检查复选框是否被选中

    我的表格上有复选框
  • “网络错误:404 未找到”/style.css

    我在萤火虫中遇到错误 网络错误 404 未找到 已删除 style css 这意味着什么以及我需要做什么 Thanks HTTP 404 的含义正如其所言 未找到文件 在文档中的某个位置 您链接到 removed style css 并且该
  • Android:如何与WebView的内容进行交互?

    有没有一种方法可以以编程方式与内容进行交互WebView 例如 我的应用程序如何 响应事件 例如点击网页上的按钮 迭代所有的INPUT页面中的元素并检索其内容 找到所有DIV元素与类status并更改其内容 Thanks 您可以使用 Jav
  • setMessageBody 中忽略新行和返回

    我是不是在做一些蠢事 我可以预填写并发送电子邮件 但 r n 在 emailBody 中被忽略 void sendEventInEmail MFMailComposeViewController picker MFMailComposeVi
  • 执行 aapt 时出错:无法运行程序,CreateProcess 错误=5,访问被拒绝:CreateProcess 错误=5,访问被拒绝

    今天 我刚刚使用 Android SDK Manager 更新了 Windows 7 上的 Android SDK 并在 Eclipse 中构建期间开始出现错误 其中显示 执行aapt时出错 无法运行程序 CreateProcess错误 5
  • 如何通过单击按钮打开和关闭引导警报?

    我想通过按钮单击事件多次显示警报框 而无需刷新页面 但警报框仅显示一次 如果我想再次显示警报框 我必须刷新页面 目前 如果您在页面上呈现引导警报 则当您关闭它时 警报的 div 容器将从页面中消失 因此 当您再次单击该按钮时 它就不再显示
  • 如何使用 Subversion 服务器删除和创建新的存储库?

    好吧 我只是做了一些愚蠢的事情 我正在第一次设置一个供承包商使用的颠覆服务器 我完成了一键设置 创建了我的项目 并第一次签入了我们的应用程序 我认为稍后会进行操作并删除配置文件中连接字符串中的密码信息 Duh 所以现在我需要删除存储库中的该
  • 作为装饰器登录与依赖注入 - 如果我需要登录类内部怎么办?

    我最初问这个问题是在这条评论 https stackoverflow com questions 7905110 logging aspect oriented programming and dependency injection tr
  • Tkinter 创建带循环的选项菜单

    我创建了一个代码 使用 for 循环使用字典中的值创建 tkinter OptionMenus 该代码似乎运行成功 OptionMenus 根据需要在窗口上显示带有关键字 import tkinter as tk from tkinter
  • 从事务性平面数据库填充事实表和维度表的最佳实践

    我想在 SSIS SSAS 中填充星型模式 多维数据集 我准备了所有维度表和事实表 主键等 源是一个 平面 项目级别 表 我现在的问题是如何拆分它 并将其从一个放入相应的表中 我做了一些谷歌搜索 但找不到令人满意的解决方案 人们会认为这是
  • C: dup2、pipe 和 fork 未按预期工作

    我正在尝试做一个简单的 fork gt 执行另一个程序 gt 向该子进程说 你好 gt 读回一些内容 gt 打印收到的内容 用作子程序的程序只是等待任何输入行并将某些内容打印到标准输出 例如 你好 这是我的 主机 程序 不起作用 inclu
  • npm 对于 socket.io/installing stuff 意味着什么?

    我在这方面真是个菜鸟 我刚刚开始接触node js socket io html5 之类的东西 我终于弄清楚如何使用命令提示符 使用 Windows 通过命令 node example js 启动 hello world 应用程序 但有什么
  • django-admin.py startproject 打开记事本,而不是创建项目

    嘿 所以基本上 当我尝试 django admin py startproject mysite 时 带有 django admin py 文件的记事本会打开 而不是创建新的实际项目 我在 Windows 上 就在昨天我创建了该项目 一切都
  • 禁用页面上的所有验证控件

    在开发周期的早期阶段 如果我们只想快速地从一个表单移动到另一个表单 那么让所有验证控件强制执行其规则会有点烦人 禁用页面上所有验证器控件的最简单方法是什么 设置一个 javascript 来获取页面中的所有验证器控件 并在 for 循环中将
  • 将观察者添加到 BOOL 变量

    是否可以将观察者添加到简单变量 例如 BOOL 或 NSIntegers 并查看它们何时发生变化 Thanks 您观察键 当它们的值发生变化时会收到通知 数据类型可以是任何类型 对于定义为 Objective C 属性的任何内容 在 h 文
  • Camel如何以流模式处理json?

    为了在流模式下读取 json 并解组 Camel OOB 中有哪些可用选项 如果不是现成的 如何实施 我发现camel xstream 可能会有所帮助 流模式是默认的还是我们需要做其他事情来使其以流模式读取 还有 Jackson Strea
  • 如何在 Symfony 4 中使用事件处理异常?

    现在我正在尝试捕获这样的异常事件 try echo 1 0 catch Exception e subs new ExceptionSubscriber this gt dispatcher gt addSubscriber subs 我定
  • 是否应该始终使用 boost::ptr_vector 代替 std::vector ?

    这只是我遇到的一个概念性问题 在我当前的项目中 感觉我过度使用了 boostsmart ptr and ptr container图书馆 我正在创造boost ptr vectors在许多不同的对象中 并调用 Transfer 方法从一个对
  • AttributeError:“float”对象没有属性“lower”

    我面临这个属性错误 并且我陷入了如何处理浮点值 如果它们出现在推文中 的问题 流式推文必须小写并标记化 因此我使用了 split 函数 有人可以帮我解决这个问题 有任何解决方法或解决方案吗 这是error我正在 AttributeError
  • 如何清理redis中不活跃的玩家?

    我正在制作一个使用 redis 来存储游戏状态的游戏 它可以很好地跟踪位置和玩家 但我没有一个好的方法来清理不活跃的玩家 每当玩家移动时 这是一个半慢速移动游戏 想想每秒 1 5 帧 我就会用新位置更新哈希并删除旧位置键 跟踪活跃玩家的最佳