我目前有一个类似的数据集:
channel1 = user1,user2,user3
channel2 = user4,user5,user6
(注意 - 这些不是实际名称,文字不是可预测的序列)
我希望获得以下最优化的功能:
1)将用户添加到频道
2)从频道中删除用户
3)获取几个所选频道中所有用户的列表,保持他们所在频道的知识(如果重要的话 - 这也可以简单地检查一个频道是否有任何用户没有得到它们的实际清单)
4)检测特定用户是否在频道中(如有必要,愿意放弃此功能)
我有点担心的事实是,我只能通过两种方式同时获得多个密钥:
A)使用常规键和mget key1,key2,key3
B)使用集合和sunion
任何可以在最佳时间和原子操作中实现上述要点的解决方案?
编辑:在我的特定情况下可能有效的一个想法是将频道名称存储为用户名的一部分,然后使用集合。不过,获得更通用的答案会很棒
答案 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命令 - 如果您需要检查多个用户,请对其进行管道处理。