获得多套

时间:2013-09-29 14:55:16

标签: redis

我目前有一个类似的数据集:

  

channel1 = user1,user2,user3

     

channel2 = user4,user5,user6

注意 - 这些不是实际名称,文字不是可预测的序列

我希望获得以下最优化的功能:

1)将用户添加到频道

2)从频道中删除用户

3)获取几个所选频道中所有用户的列表,保持他们所在频道的知识(如果重要的话 - 这也可以简单地检查一个频道是否有任何用户没有得到它们的实际清单)

4)检测特定用户是否在频道中(如有必要,愿意放弃此功能)

我有点担心的事实是,我只能通过两种方式同时获得多个密钥:

A)使用常规键和mget key1,key2,key3

  • 在此解决方案中,每个值都是一个JSON字符串,然后可以对其进行操作并查询客户端以添加/删除/确定值。这本身有几个问题 - 首先,在处理数据时,另一个客户端可能会更改数据(即此解决方案不是原子解决方案),如果某个频道包含特定用户,即使很容易检测到它也不容易检测某个频道是否有任何用户(这是低优先级,如上所述)

B)使用集合和sunion

  • 我真的想以某种方式使用这个解决方案的集合,上面的解决方案似乎错了......但我看不出如何一次查询多个集合并维护每个成员来自哪个集合的信息或者是否有任何联盟中的集合有0个成员(sunion只给出了所有组合成员的最终集合)

任何可以在最佳时间和原子操作中实现上述要点的解决方案?

编辑:在我的特定情况下可能有效的一个想法是将频道名称存储为用户名的一部分,然后使用集合。不过,获得更通用的答案会很棒

1 个答案:

答案 0 :(得分:2)

简答:使用sets + pipelining + MULTI / EXEC,或设置+ Lua。

1)将用户添加到频道

SADD命令

2)从频道中删除用户

SREM命令

3)获取多个所选频道中所有用户的列表

有几种方法可以做到。

如果您不需要严格的原子性,则只需要pipeline几个SMEMBERS命令即可​​在一次往返中检索所有集合。如果您只是对渠道是否有用户感兴趣,可以用SCARD替换SMEMBERS。

如果您需要严格的原子性,可以管道包含SMEMBERS或SCARD命令的MULTI / EXEC块。 EXEC命令的输出将包含所有结果。这是我建议的解决方案。

另一种(原子)方法是使用EVAL命令调用服务器端Lua脚本。 Lua脚本执行总是原子的。该脚本可以将多个通道作为输入参数,并构建一个多层批量回复以返回输出。

4)检测特定用户是否在频道中

SISMEMBER命令 - 如果您需要检查多个用户,请对其进行管道处理。