如何在redis中有效地结合非重叠集?

问题描述:

我有一个用例,我知道一些事实,即我在redis商店中实现的一些集合是不相交的。我的一些设置很大,因此,它们的sunionsunionstore需要相当长的时间。 redis是否提供处理此类工会的任何功能?如何在redis中有效地结合非重叠集?

或者,如果在每次插入之前没有检查唯一性,就可以将元素添加到Redis中的某个集合中,这可以解决我的问题。

实际上,由于操作的相对成本,不需要这种功能。因为单个插入操作的分期复杂性为O(1),所以在构建Redis对象(例如集合或列表)时,成本不受数据结构管理(散列表或链接列表)支配。成本主要由所有项目(即设置的对象或列表对象)的分配和初始化决定。当您检索这些对象时,成本主要由输出缓冲区的分配和格式决定,而不是数据结构中的访问路径。

因此,绕过集合的唯一性并不会带来显着的优化。

若要优化SUNION命令(如果集合是不相交的),最好是用多个SMEMBERS命令的管道替换它以检索各个集合(并在客户端构建联合)。

优化SUNIONSTORE并不是真的可行,因为不相交集合是性能的最坏情况。表现主要取决于结果项目的数量,因此相同的项目越少,响应时间就越多。

+1

SUNIONSTORE是O(N),N表示元素的总数,无论您拥有多少常用物品(要知道它是一个常见物品,您必须阅读它)。您正在与SINTERSTORE混合为O(N * M),其中N是最小集合的基数,M是集合的数量。 – 2014-12-03 12:00:21

+1

我在谈论**个人**行动的成本。 SUNIONSTORE是O(n),正是因为单个插入的成本是O(1)。我的回答确实与工会不相交有关。 – 2014-12-03 12:35:06

+1

看看这里:https://github.com/antirez/redis/blob/73a809b1591378e1042a1028d0b8e10217e6e7c7/src/t_set.c#L797 – 2014-12-03 13:25:25