【Redis】Set

文章目录

  • Redis set 基础操作
  • Redis set 底层实现
    • 对象编码
      • INTSET 无序
      • HASHTABLE 有序
  • Q & A
    • Set是有序的吗?
    • 如何查看Set所有成员
    • 如何查看Set中成员个数?
    • 如何求两个Set的并集或交集?
    • Set编码方式是什么?
    • Set为什么要用两种编码方式?

Redis set 基础操作

  • SADD adds a new member to a set.
  • SREM removes the specified member from the set.
  • SISMEMBER tests a string for set membership.
  • SINTER returns the set of members that two or more sets have in common (i.e., the intersection).
  • SCARD returns the size (a.k.a. cardinality) of a set.
    【Redis】Set_第1张图片
  • SSCAN: SSCAN key cursor [MATCH pattern] [COUNT count]
    • 指定游标查询,默认查看个数为10,可以指定个数。如果集合元素个数超过10,继续按照新游标向下查询,知道返回游标为0即查询完毕。
    • 可以使用MATCH模糊查询:SSCAN SETNUM 0 MATCH 1*

Redis set 底层实现

对象编码

INTSET 无序

  • 如果集群元素都是整数,且元素数量不超过512个,使 用INTSET编码
    【Redis】Set_第2张图片

  • 排列紧凑,内存占用少,内存友好

  • INTSET的数组默认下是int16编码,但若某个元素从int16变成int32或int64,那么所有元素的大小都变成int32或int64,会造成一定的空间浪费。

  • 查询:二分查找。因为intset是有序的,所以用二分查找已经是logN的时间复杂度,是最优解了。

HASHTABLE 有序

  • 不满足INTSET的条件时,用HASHTABLE
  • 【Redis】Set_第3张图片
  • 查找时间复杂度:O(1)

Q & A

Set是有序的吗?

Set无序,但Set有两种编码方式,分别是INTSET和HASHTABLE/
INTSET编码是有序的,HASHTABLE是无序的,但这并不影响SET是无序的。

如何查看Set所有成员

SMEMBERS

如何查看Set中成员个数?

SCARD

如何求两个Set的并集或交集?

并集:SUNION
交集:SINTER

Set编码方式是什么?

INTSET:有序,内存友好,二分查找,512个以内的整数
HASHTABLE:空间换时间,查找更快O(1)

Set为什么要用两种编码方式?

空间换时间,INTSET元素少要空间,因为元素少,就算时间复杂度高,绝对时间也不会差太多。
HASHTABLE:元素数量变大时,查找速度会更快。

你可能感兴趣的:(redis,数据库,缓存)