使用Redis检查一个集合中的哪些键存在于另一个已排序集合中的最佳方法是什么

使用Redis检查一个集合中的哪些键存在于另一个已排序集合中的最佳方法是什么,redis,Redis,假设我有一组在线用户,其中可能包含20000个条目 下一步,假设每个用户都有自己的一组他们正在跟踪的人 当一个用户登录时,我想检查一下下面列表中的哪些用户是在线的 就我所知,有两种选择 MULTI ZINTERSTORE temp 2 online, following ZRANGE temp 0 -1 DEL temp MULTI EXEC 或者,我可以让列表用户按照下面的列表,然后循环遍历所有用户,为每个用户启动ISMEMBER调用: SMEMBERS following

假设我有一组在线用户,其中可能包含20000个条目

下一步,假设每个用户都有自己的一组他们正在跟踪的人

当一个用户登录时,我想检查一下下面列表中的哪些用户是在线的

就我所知,有两种选择

MULTI
ZINTERSTORE temp 2 online, following
ZRANGE temp 0 -1
DEL temp
MULTI EXEC
或者,我可以让列表用户按照下面的列表,然后循环遍历所有用户,为每个用户启动ISMEMBER调用:

    SMEMBERS following


   MULTI
   foreach(following as fol){
      ISMEMBER online fol
   }
  MULTI EXEC
这两种方法都不适合我。有更好的办法吗?如果不是的话,如果我们假设一个普通用户在下面的列表中有200人,平均在线人数为20000人,那么上面哪一个是最符合共振峰的


提前感谢。

redis文档有助于正确理解您的问题解决方案

看看第一个解决方案,它需要时间复杂度:O(N*K)+O(M*log(M))在最坏的情况下,N是最小的输入排序集,K是输入排序集的数量,M是结果排序集中的元素数量。当你需要比较2万粉丝和2万平均在线人数时,这一点至关重要

您的第二个解决方案要好得多。基于(O(1)),在最坏的情况下需要时间复杂度O(N),其中N是最小的输入集

关于用户在线处理,有更多有趣的解决方案。您应该了解和-如果您的用户具有常规ID,它最多可以处理2^32位或用户。例如-id为1的用户-第一位,345-第345位,依此类推。在这种情况下,最多4294967296个用户只有512mb的内存,并且O(1)获取/设置用户状态的时间复杂度。并使用第二种方法将已排序的追随者集与在线数据相交

如果使用redis>=2.6,您应该尝试使用LUA来优化第二种类型的解决方案。例如,
map/reduce
在我的笔记本电脑上为每个人分配200000个按键只需约720ms。然后
1ms用于一组200个用户。

是否为每个用户设置哈希?在用户哈希中添加一个“在线”属性并进行检查不是更简单吗?我不知道,但我正在制定用于此应用程序的最佳数据结构,因此我当然愿意更改为哈希。所以你的意思是,我最好为每个用户创建一个持久散列。用户登录时,将users online属性设置为true。然后,当另一个用户登录时,拉取这个用户正在跟踪的已排序用户集,并为排序集中的每个用户执行多个hget命令,以检查每个用户的联机属性?如果你能推断出答案,我可能会认为它是正确的。谢谢:)非常好的回答。。。非常感谢您如此详细地解释。我想让您知道我现在正在使用您的getbit方法,它在各个方面都非常完美。我现在可以在512mb内存中存储420亿用户(如果我有)的在线状态。我确实需要创建一个基于字符串的用户ID到基于整数的用户ID的散列,但通过将用户散列分为1000个条目存储桶,并确保它们都已Ziplited,此散列在内存方面非常简单(100万用户为16mb),最重要的是,查找仍然是0(1),谢谢:)