关于redis SISMEMBER复杂性的一些困惑

时间:2016-06-15 10:51:29

标签: redis

redis命令SISMEMBER set1 member1如何复杂度为O(1),因为它应扫描整个集合以识别“member1”?

1 个答案:

答案 0 :(得分:1)

因为它使用哈希表。

集合中的每个元素都将被散列为32位字符串,如:fc5e038d38a57032085441e7fe7010b0。对于不同的字符串,32位字符串将始终不同。无论原始字符串有多长,散列字符串总是32位长。

当redis想知道字符串是否在集合中时,它首先散列原始字符串,然后检查32位字符串是否在集合中。

例如," helloworld"的32位字符串。是fc5e038d38a57032085441e7fe7010b0,如果redis想检查" helloworld"在一个集合中,然后结果会检查fc5e038d38a57032085441e7fe7010b0是否在集合中。

就像你在字典中寻找一个单词一样。

  1. redis查找以f
  2. 开头的所有字符串
  3. redis从步骤1的结果中查找第二个字符为c的所有字符串。
  4. redis从步骤2的结果中查找其第三个字符为5的所有字符串。
  5. 重复并重复。
  6. 因此,无论原始字符串有多长,redis最多会查询32次,是否可以知道原始字符串是否在一个集合中。

    因此,复杂性为O(1)