持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
本文讲解下redis五大常用数据类型当中的Set,主要从其数据结构,以及常用的方法进行讲解。
数据结构
Redis的set提供一个列表的功能,与java中的set相同,它同样是不允许重复元素的,与list不同的是它提供一个判断某个元素是否在集合内的接口。
Set数据结构是dict字典,字典是用哈希表(其实是一个value为null的哈希表,所以添加,删除,查找的复杂度都是O(1))实现的。字典表的实现会在后面的章节讲解。
常用命令
sadd 添加元素
将一个或多个元素添加到该key的集合中。
其格式sadd <key><member1><member2>
如下所示,返回本次添加元素的数量,已经存在的数据则返回0,表示忽略:
127.0.0.1:0>sadd student tom jerry lucy;
"3"
127.0.0.1:0>sadd student tom jerry lucy;
"0"
127.0.0.1:0>sadd student james;
"1"
smembers 取出元素
取出set中的全部元素,其格式为:smembers <key>
如下所示,返回当前集合中的全部元素,不同于前面讲的list的pop操作,此操作不会清空集合,可重复获取:
127.0.0.1:0>smembers student
1) "james;"
2) "lucy;"
3) "jerry"
4) "tom"
127.0.0.1:0>smembers student
1) "james;"
2) "lucy;"
3) "jerry"
4) "tom"
sismember 是否包含某元素
判断此集合是否包含某个value值,这就是前面说的,与list不同的地方。
其格式为:sismember <key><member>
如下所示,如果存在某个元素,则返回1,否则返回0。
127.0.0.1:0>sismember student tom
"1"
127.0.0.1:0>sismember student joy
"0"
scard 返回集合的元素个数
用于返回该集合的元素个数。
其格式为 scard <key>。
如下所示:
127.0.0.1:0>scard student
"4"
srem 删除元素
指定删除集合中的一个或多个元素。
其格式为:srem <key> <member1><member2>。
如下所示,返回删除元素的个数。
127.0.0.1:0>smembers student
1) "james;"
2) "lucy;"
3) "jerry"
4) "tom"
127.0.0.1:0>srem student jerry tom
"2"
127.0.0.1:0>smembers student
1) "james;"
2) "lucy;
spop 吐出元素
从集合当中随机的吐出一个或多个元素,吐出即被删除。与list的pop相同,但是是随机的。
其格式为:spop <key>[count]。
如下所示,吐出两个元素,再次获取集合为空。
127.0.0.1:0>spop student 2
1) "lucy;"
2) "james;"
127.0.0.1:0>smembers student
srandmember 取出元素
随机从集合当中取出一个或多个元素,且不会被删除。
其格式如下:srandmember <key>[count] 。
如下所示,先添加四个元素,随机取出两个,仍然有四个。
127.0.0.1:0>sadd student tom jerry james lucy
"4"
127.0.0.1:0>smembers student
1) "james"
2) "jerry"
3) "lucy"
4) "tom"
127.0.0.1:0>srandmember student 2
1) "jerry"
2) "james"
127.0.0.1:0>smembers student
1) "james"
2) "jerry"
3) "lucy"
4) "tom"
smove 移动元素
将一个集合中的元素,移动到另一个集合当中。
其格式如下:smove <source><destination><member>
如下所示,新建一个集合,添加元素,将student的james移动到friend,返回移动数量。
127.0.0.1:0>sadd friend xiaoming
"1"
127.0.0.1:0>smembers friend
1) "xiaoming"
127.0.0.1:0>smove student friend james
"1"
127.0.0.1:0>smembers friend
1) "james"
2) "xiaoming"
127.0.0.1:0>smembers student
1) "jerry"
2) "lucy"
3) "tom"
sinter 返回交集
-
sinter :返回两个集合当中的交集元素。
其格式:
sinter <key1><key2> -
sinterstore:返回两个集合的交集元素并存入另一个集合中。
其格式:
sinterstore <dest> <key1> <key2>
如下所示,在集合friend中添加一个元素lucy,返回交集元素lucy,且不会删除。
127.0.0.1:0>sadd friend lucy
"1"
127.0.0.1:0>sinter student friend
1) "lucy"
127.0.0.1:0>smembers student
1) "jerry"
2) "lucy"
3) "tom"
如下所示,将交集元素lucy添加到新的集合girl中:
127.0.0.1:0>sinterstore girl student friend
"1"
127.0.0.1:0>smembers girl
1) "lucy"
sunion 返回并集
-
sunion:返回两个集合的并集元素。
其格式如下:
sunion <key1> <key2> -
sunionstore: 返回两个集合的并集元素,并存入另一个集合中。
其格式如下:
sunion <dest> <key1> <key2>
如下所示,获取并集:
127.0.0.1:0>sunion student friend
1) "tom"
2) "lucy"
3) "jerry"
4) "xiaoming"
5) "james"
如下所示,获取并集,并存入girl:
127.0.0.1:0>sunionstore girl student friend
"5"
127.0.0.1:0>smembers girl
1) "tom"
2) "lucy"
3) "jerry"
4) "xiaoming"
5) "james"
sdiff 获取差集
-
sdiff:返回两个集合的差集元素,返回在key1中存在,而在key2中不存在的元素。
其格式如下:
sdiff <key1> <key2> -
sdiffstore: 返回两个集合的差集元素,返回在key1中存在,而在key2中不存在的元素,并存入另一个集合中。
其格式如下:
sdiff <dest> <key1> <key2>
如下所示,获取student和friend的差集:
127.0.0.1:0>sdiff student friend
1) "jerry"
2) "tom"
如下所示,获取student和friend的差集,并存入boy中
127.0.0.1:0>sdiffstore boy student friend
"2"
127.0.0.1:0>smembers boy
1) "jerry"
2) "tom"