Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.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/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
Php 通过Redis排序集中的时间戳管理旧元素_Php_Redis - Fatal编程技术网

Php 通过Redis排序集中的时间戳管理旧元素

Php 通过Redis排序集中的时间戳管理旧元素,php,redis,Php,Redis,在redis中,你有一个排序集a,你不时向其中添加新元素,它们会按等级排序,例如,你也有一个排序集B 有没有办法检查集合a中是否有元素已经存在超过20秒,然后将它们移动到已排序的集合B 因为这个检查操作非常频繁,而且列表可能非常大,所以迭代集合中的每个元素不是一个好的解决方案。我需要最快的 谢谢 更新: 以下是我想做的: 基本上,这个想法是,想象一下你有一个游戏服务器,当对手提出战斗请求时,它可以与对手进行比赛。当前的设计是,每个请求都会进入集合,排名/分数就是玩家的排名。这样一来,名单中每两个

在redis中,你有一个排序集a,你不时向其中添加新元素,它们会按等级排序,例如,你也有一个排序集B

有没有办法检查集合a中是否有元素已经存在超过20秒,然后将它们移动到已排序的集合B

因为这个检查操作非常频繁,而且列表可能非常大,所以迭代集合中的每个元素不是一个好的解决方案。我需要最快的

谢谢

更新: 以下是我想做的:
基本上,这个想法是,想象一下你有一个游戏服务器,当对手提出战斗请求时,它可以与对手进行比赛。当前的设计是,每个请求都会进入集合,排名/分数就是玩家的排名。这样一来,名单中每两个彼此接近的球员就是完美的对手。每隔5秒左右就会调用一个脚本get,从集合的顶部提取50行,并将其2×2匹配并删除。这很好,我认为这是一个非常快速有效的解决方案。但是后来,创造一个机器人AI玩家的想法出现了。所以当玩家在游戏中等待的时间太长时,他会和机器人AI玩家配对。我想不出一个办法来看看谁等得太久基本上可能整个想法都错了。。因此,欢迎任何更好的想法:非常感谢。

如果排序集中的分数是unix时间戳,则可以使用从集合a中获取最早的NN项。然后可以进行检查,将符合条件的项添加到集合B,然后将其从集合a中删除

如果你在集合A中的得分不是基于时间戳的,那么你将不得不在集合A上完全迭代,或者重新考虑你的设计。Redis关键点没有一个固有的可用时间戳,即它们何时被添加,这对于关键点中的项目(如排序集)具有双重真实性,因此它必须是您专门创建和跟踪的内容。也许如果你能分享更多关于你正在做的事情以及我们为什么能提供更多细节的帮助

编辑: 根据您的补充问题,我建议您尝试一种类似@akonsu建议的解决方案

具体而言: 排序-集合-A:按等级排列的球员与现在一样

排序-Set-B: 使用时间戳作为人员进入队列的时间,存储其用户ID。换句话说,当你用它们的秩和ID添加到SetA时,你用时间戳和ID添加到SetB

当你和球员比赛时,你会把他们从两盘中除名。如果您使用zrange命令从SetB中提取要匹配的用户集,以获取X个最早的条目,您将有时间按照条目的顺序(如FIFO)排队。然后在SetA上使用zrange命令,其秩+/-您需要的任何秩范围。如果你得到了一场比赛,你可以将他们从两盘中移除,继续比赛

如果SetA中没有合适的对手,并且他们的时间戳已经足够长了,你可以与AI进行匹配,然后将他们从两个集合中移除,继续前进

本质上,它是用户->时间戳的索引队列。这样做意味着所有用户的队列时间更短,因为您现在正在按照队列长度的顺序匹配他们。您仍然使用SetA根据玩家的排名进行匹配,但现在您正在根据时间索引和排序


具体的实现可能比这更有趣,但作为一个整体策略,我认为这符合您的需要。

如果排序集中的分数是unix时间戳,您可以使用从集合a中获取最旧的NN项。然后您可以进行检查,将符合条件的项添加到集合B,然后从集合a中删除它们

如果你在集合A中的得分不是基于时间戳的,那么你将不得不在集合A上完全迭代,或者重新考虑你的设计。Redis关键点没有一个固有的可用时间戳,即它们何时被添加,这对于关键点中的项目(如排序集)具有双重真实性,因此它必须是您专门创建和跟踪的内容。也许如果你能分享更多关于你正在做的事情以及我们为什么能提供更多细节的帮助

编辑: 根据您的补充问题,我建议您尝试一种类似@akonsu建议的解决方案

具体而言: 排序-集合-A:按等级排列的球员与现在一样

排序-Set-B: 使用时间戳作为人员进入队列的时间,存储其用户ID。换句话说,当你用它们的秩和ID添加到SetA时,你用时间戳和ID添加到SetB

当你和球员比赛时,你会把他们从两盘中除名。如果您使用zrange命令从SetB中提取要匹配的用户集,以获取X个最早的条目,您将有时间按照条目的顺序(如FIFO)排队。然后在SetA上使用zrange命令,其秩+/-您需要的任何秩范围。如果你得到了一场比赛,你可以将他们从两盘中移除,继续比赛

如果SetA中没有合适的对手,并且他们的时间戳足够长,你可以与AI匹配,那么将他们从SetA中移除 这两个设置和前进

本质上,它是用户->时间戳的索引队列。这样做意味着所有用户的队列时间更短,因为您现在正在按照队列长度的顺序匹配他们。您仍然使用SetA根据玩家的排名进行匹配,但现在您正在根据时间索引和排序


具体的实现可能比这更有趣,但作为一个整体策略,我认为这符合您的需要。

您可以使用一个辅助有序集,其中可以存储元素,并将其时间戳作为分数。不确定我是否可以使用时间戳作为分数,作为用于其他内容的分数。我用更多信息更新了帖子。谢谢我建议在现有的基础上创建另一个有序集,并使用时间戳作为分数。如果我使用时间戳作为分数,我将无法使用用户评分作为分数,因此匹配将无法正常工作。同样,您可以有三个有序集:A和B,正如您在原始问题中所做的那样,和C,其中存储的项目与A中的项目相同,但时间戳作为分数。可以使用一个辅助有序集,其中可以存储元素,并将其时间戳作为分数。不确定是否可以使用时间戳作为分数,作为用于其他内容的分数。我用更多信息更新了帖子。谢谢我建议在现有的基础上创建另一个有序集,并使用时间戳作为分数。如果我使用时间戳作为分数,我将无法使用用户评分作为分数,因此匹配将无法正常工作。同样,您可以有三个有序集:A和B,正如您在原始问题中所做的那样,和C,其中存储与A中相同的项目,但时间戳作为分数。