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
多用户在线redis sismember检查_Redis - Fatal编程技术网

多用户在线redis sismember检查

多用户在线redis sismember检查,redis,Redis,我使用redis获取在线用户我只想检查某个用户是否在线 首先将用户添加到联机 sadd在线用户用户 (整数)1 检查用户a是否在线 SISSember在线用户用户 (整数)1 我的问题是如何检查多用户是否在线,比如 添加soem用户 sadd在线用户用户 (整数)1 sadd在线用户用户 (整数)1 sadd在线用户用户 (整数)1 现在我想检查三个用户是否在线 SISSember online_用户{user_a,user_b,user_c} 我不知道这是否正确,但我想多用户检查返回数据,如

我使用redis获取在线用户我只想检查某个用户是否在线

首先将用户添加到联机

sadd在线用户用户

(整数)1

检查用户a是否在线

SISSember在线用户用户

(整数)1

我的问题是如何检查多用户是否在线,比如

添加soem用户

sadd在线用户用户

(整数)1

sadd在线用户用户

(整数)1

sadd在线用户用户

(整数)1

现在我想检查三个用户是否在线

SISSember online_用户{user_a,user_b,user_c}

我不知道这是否正确,但我想多用户检查返回数据,如
{0,1,0}={offline,online,offline}

您必须为每个用户独立调用
SISMEMBER
。为了简化流程并使其更高效,请考虑使用Lua脚本。例如:

~$ redis-cli SADD online_users user_a user_b user_c
(integer) 3
~$ redis-cli --eval sismmember.lua online_users , user_a user_b user_c foo
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (integer) 0
~$ cat sismmember.lua 
local rep = {}
local ele = table.remove(ARGV,1)

while (ele) do
    rep[#rep+1] = redis.call('SISMEMBER',KEYS[1],ele)
    ele = table.remove(ARGV,1)
end

return rep
~$ 

您必须独立地为每个用户调用
SISMEMBER
。为了简化流程并使其更高效,请考虑使用Lua脚本。例如:

~$ redis-cli SADD online_users user_a user_b user_c
(integer) 3
~$ redis-cli --eval sismmember.lua online_users , user_a user_b user_c foo
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (integer) 0
~$ cat sismmember.lua 
local rep = {}
local ele = table.remove(ARGV,1)

while (ele) do
    rep[#rep+1] = redis.call('SISMEMBER',KEYS[1],ele)
    ele = table.remove(ARGV,1)
end

return rep
~$ 

最好的方法是比较两组数据

1-在第一套redis中保留您的“联系人”

SADD联系人:您的\u id用户\u 1用户\u 2用户\u 3用户\u 4

2-创建另一组所有已连接用户

SADD连接的用户\u 1用户\u 2用户\u 3用户\u 6用户\u 78

然后使用命令SINTER,它将为您提供这两个集合之间的交集,这意味着您的所有联系人都已连接

SINTER connected contacts:your_id
只需记住保持集“连接”良好更新。。。那是另一个故事


希望这有帮助。

最好的方法是比较两组数据

1-在第一套redis中保留您的“联系人”

SADD联系人:您的\u id用户\u 1用户\u 2用户\u 3用户\u 4

2-创建另一组所有已连接用户

SADD连接的用户\u 1用户\u 2用户\u 3用户\u 6用户\u 78

然后使用命令SINTER,它将为您提供这两个集合之间的交集,这意味着您的所有联系人都已连接

SINTER connected contacts:your_id
只需记住保持集“连接”良好更新。。。那是另一个故事


希望这能有所帮助。

您是在使用cli还是其他工具?我只是使用redis并将其与php或node.js一起使用,因此您需要使用php或node的实践来加载和运行脚本。通常这只是将脚本本身(而不是文件名)发送到客户端的EVAL方法,使用脚本加载和EVALSHA可以获得更好的性能。您是使用cli还是其他工具?我只是使用redis并将其与php或node.js一起使用,因此您需要使用php或node的实践来加载和运行脚本。通常,这只是将脚本本身(而不是文件名)发送到客户端的EVAL方法的问题。当然,一旦脚本按需要运行,请使用脚本加载和EVALSHA以获得更好的性能。
SINTER
似乎是多余的-如果您已经保持
连接
最新,只需
SMEMBERS
SSCAN
it即可。从这个意义上讲,
连接的
在OPs
在线用户中实际上是相同的
。。。OTOH,你的回答被接受了,所以也许我没有得到这个:)
SINTER
看起来是多余的-如果你已经保持
connected
最新,只需
SMEMBERS
SSCAN
就可以了。从这个意义上讲,
连接的
在OPs
在线用户中实际上是相同的
。。。OTOH,你的回答被接受了,所以也许我没有得到这个:)