gpt4 book ai didi

redis - 获取多组

转载 作者:IT王子 更新时间:2023-10-29 06:02:04 24 4
gpt4 key购买 nike

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

channel1 = user1,user2,user3

channel2 = user4,user5,user6

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

我希望对以下内容进行最优化的功能:

1) 将用户添加到 channel

2) 从 channel 中删除用户

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

4) 检测特定用户是否在 channel 中(必要时愿意放弃此功能)

我对一次获取多个 key 只有两种方法的事实感到有点困惑:

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

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

B) 使用集合和 sunion

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

有什么解决方案可以在最佳时间和原子操作中实现上述第 1-4 点?

编辑:一种可能适用于我的特定情况的想法是将 channel 名称存储为用户名的一部分,然后使用集合。不过,如果能得到一个更通用的答案就太好了

最佳答案

简答:使用集合+流水线+MULTI/EXEC,或者集合+Lua。

1) 将用户添加到 channel

SADD命令

2) 从 channel 中删除用户

SREM命令

3) 获取多个选定 channel 的所有用户列表

有几种方法可以做到这一点。

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

如果您需要严格的原子性,您可以流水线化包含 SMEMBERS 或 SCARD 命令的 MULTI/EXEC block 。 EXEC 命令的输出将包含所有结果。这是我推荐的解决方案。

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

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

SISMEMBER命令 - 如果您需要检查多个用户,则通过管道传输它们。

关于redis - 获取多组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19079441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com