一、简介
集合类型 (Set) 是一个无序并唯一的键值集合。
集合与列表的区别:
- 列表可以存储重复元素,集合只能存储非重复元素;
- 列表是按照元素的先后顺序存储元素的,而集合则是无序方式存储元素的。
二、基础使用
1、添加一个或多个元素
语法:sadd key member [member …]
127.0.0.1:6379> sadd myset v1 v2 v3
(integer) 3
2、查询集合所有元素
语法:smembers key
127.0.0.1:6379> smembers myset
1) "v1"
2) "v2"
3) "v3"
3、查询集合的成员数量
语法:scard key
127.0.0.1:6379> scard myset
(integer) 3
4、查询集合中是否包含某个元素
语法:sismember key member
返回1表示包含,0表示不包含该元素
127.0.0.1:6379> sismember myset v1
(integer) 1
127.0.0.1:6379> sismember myset v4
(integer) 0
5、从一个集合中移动一个元素到另一个集合
语法:smove set1 set2 member
127.0.0.1:6379> sadd myset2 s1 s2 s3 s4
(integer) 4
127.0.0.1:6379> smove myset2 myset s4
(integer)1
127.0.0.1:6379> smembers myset
1) "v1"
2) "v3"
3) "v2"
3) "s4"
6、移除集合中一个或多个元素
语法:srem key member [member …]
127.0.0.1:6379> srem myset v1
(integer)1
127.0.0.1:6379> smembers myset
1) "s4"
2) "v3"
3) "v2"
三、内部实现
集合类型是由 intset (整数集合) 或 hashtable (普通哈希表) 组成的。当集合中所有的值都为整数时,Redis 会使用 intset 结构来存储;当集合类型以 hashtable 存储时,哈希表的 key 为要插入的元素值,而哈希表的 value 则为 Null。
四、使用场景
- 微博关注我的人和我关注的人都适合用集合存储,可以保证人员不会重复;
- 中奖人信息也适合用集合类型存储,这样可以保证一个人不会重复中奖。