文章目录
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.
- SSCAN: SSCAN key cursor [MATCH pattern] [COUNT count]
- 指定游标查询,默认查看个数为10,可以指定个数。如果集合元素个数超过10,继续按照新游标向下查询,知道返回游标为0即查询完毕。
- 可以使用MATCH模糊查询:SSCAN SETNUM 0 MATCH 1*
Redis set 底层实现
对象编码
INTSET 无序
-
如果集群元素都是整数,且元素数量不超过512个,使 用INTSET编码
-
排列紧凑,内存占用少,内存友好
-
INTSET的数组默认下是int16编码,但若某个元素从int16变成int32或int64,那么所有元素的大小都变成int32或int64,会造成一定的空间浪费。
-
查询:二分查找。因为intset是有序的,所以用二分查找已经是logN的时间复杂度,是最优解了。
HASHTABLE 有序
- 不满足INTSET的条件时,用HASHTABLE
- 查找时间复杂度: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:元素数量变大时,查找速度会更快。