Redis如何检查元素是否是set的成员?

时间:2015-06-29 10:15:48

标签: redis

我在网上看过,Redis可以在O(1)时间内说明元素是否是set的成员。我想知道Redis是如何做到这一点的。 Redis使用什么算法来实现这一目标。

1 个答案:

答案 0 :(得分:2)

Redis Set在内部以两种方式之一实现:intsethashtable。 intset是仅对整数集进行的特殊优化,并使用intsetSearch函数来搜索集合。但是,该函数使用二进制搜索,因此实际上技术上是O(logN)。但是,由于intsets的cardinallity上限为常量(set-max-intset-entries配置指令),我们可以假设O(1)准确地反映了这里的复杂性。

hashtable用于Redis中的很多东西,包括Sets的实现。它使用键上的哈希函数将其映射到条目的表(数组)中 - 检查哈希键值是否在数组中是否在dictFind中的O(1)中直接完成。每个散列键下的元素都存储为一个链表,所以你再次基本上说O(N)来遍历它,但是考虑到散列函数的碰撞概率非常低(嗯,这里需要某种引用? )这些列表非常短,所以我们可以安全地假设它实际上是O(1)。

由于上述原因,SISMEMBER在计算复杂度方面声称为O(1)是有效的。