redis常用数据类型之Set

280 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

本文讲解下redis五大常用数据类型当中的Set,主要从其数据结构,以及常用的方法进行讲解。

数据结构

Redis的set提供一个列表的功能,与java中的set相同,它同样是不允许重复元素的,与list不同的是它提供一个判断某个元素是否在集合内的接口。

Set数据结构是dict字典,字典是用哈希表(其实是一个value为null的哈希表,所以添加,删除,查找的复杂度都是O(1))实现的。字典表的实现会在后面的章节讲解。

常用命令

sadd 添加元素

将一个或多个元素添加到该key的集合中。

其格式sadd <key><member1><member2>

image.png

如下所示,返回本次添加元素的数量,已经存在的数据则返回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>

image.png

如下所示,返回当前集合中的全部元素,不同于前面讲的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>

image.png

如下所示,如果存在某个元素,则返回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>

image.png

如下所示,返回删除元素的个数。

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]

image.png

如下所示,吐出两个元素,再次获取集合为空。

127.0.0.1:0>spop student 2
1) "lucy;"
2) "james;"
127.0.0.1:0>smembers student

srandmember 取出元素

随机从集合当中取出一个或多个元素,且不会被删除。

其格式如下:srandmember <key>[count]

image.png

如下所示,先添加四个元素,随机取出两个,仍然有四个。

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>

image.png

如下所示,新建一个集合,添加元素,将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>

image.png

如下所示,在集合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>

image.png

如下所示,获取并集:

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>

image.png

如下所示,获取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"