β

Nosql之Redis: set数据类型及操作命令

唐文博客 1215 阅读

set 类型

一:概述
set是集合,它是string类型的无序集合.set是通过hash table实现的,
添加, 删除和查找的复杂度都是O(1).对集合我们可以取并集,交集,差集.
通过这些操作我们可以实现sns中的好友推荐和博客的tag功能.

二:相关操作命令
1:sadd
描述: 增加成员到set序列
返回值:本次操作实际插入的成员数量。
命令格式: sadd key member [member...]
时间复杂度: O(N) N:表操作成员数量
操作如下:

redis 127.0.0.1:6379> sadd my_set test1
(integer) 1
redis 127.0.0.1:6379> sadd my_set test1
(integer) 0
redis 127.0.0.1:6379> sadd my_set test2
(integer) 1
redis 127.0.0.1:6379> smembers my_set
1) “test1″
2) “test2″
##连着插入多个成员
redis 127.0.0.1:6379> sadd my_set test3 test4
(integer) 2
redis 127.0.0.1:6379> smembers my_set
1) “test3″
2) “test4″
3) “test1″
4) “test2″

2: smembers
描述:获取set中所有成员
时间复杂度:O(1)
操作如上面.

3:scard
描述:获取Set中成员的数量。
时间复杂度:O(1)
4: sismember
描述:判断参数中指定成员是否已经存在于与Key相关联的Set集合中。
时间复杂度:O(1)
返回值:1表存在,0表不存在.
操作命令如下:
redis 127.0.0.1:6379> scard my_set
(integer) 4
redis 127.0.0.1:6379> sismember my_set1 aa
(integer) 0
redis 127.0.0.1:6379> sismember my_set test1
(integer) 1

5: spop
描述:随机的移除并返回Set中的某一成员。
时间复杂度:O(1)
返回值:返回移除的成员,如果该Key并不存在,则返回nil。
操作命令如下:
redis 127.0.0.1:6379> spop my_set
“test3″
redis 127.0.0.1:6379> smembers my_set
1) “test4″
2) “test1″
3) “test2″

6: srem
描述:删除参数中指定的成员(可多个)
时间复杂度:O(N) N表示被删除成员的数量
命令格式: srem key member [member ...]
返回值:返回实际删除的成员数.如果没有,返回0;
操作命令如下:
redis 127.0.0.1:6379> smembers my_set
1) “test4″
2) “test1″
3) “test2″
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> srem my_set test4
(integer) 1
redis 127.0.0.1:6379> smembers my_set
1) “test1″
2) “test2″
redis 127.0.0.1:6379> srem my_set test1 test2
(integer) 2
redis 127.0.0.1:6379> smembers my_set
(empty list or set)
7: srandmember
描述: 和SPOP一样,随机的返回Set中的一个成员,不同的是该命令并不会删除返回的成员。
时间复杂度:O(1)
返回值:返回随机位置的成员,如果Key不存在则返回nil。
操作命令如下:
redis 127.0.0.1:6379> srandmember my_set
(nil)
redis 127.0.0.1:6379> sadd my_set test1 test2
(integer) 2
redis 127.0.0.1:6379> srandmember my_set
“test1″

8: smove
描述:把一个set集合中的某个元素移动到另外一个set集合
时间复杂度:O(1)
命令格式:smove source destination member
返回值:1表示正常移动,0表示source中并不包含参数成员。
操作命令如下:
redis 127.0.0.1:6379> smembers my_set
1) “test1″
2) “test2″
redis 127.0.0.1:6379> smembers my_set_2
(empty list or set)
redis 127.0.0.1:6379> smove my_set my_set_2 test1
(integer) 1
redis 127.0.0.1:6379> smembers my_set_2
1) “test1″
redis 127.0.0.1:6379> smembers my_set
1) “test2″

##成员不存时
redis 127.0.0.1:6379> smove my_set_2 my_set_3 aa
(integer) 0
9: sdiff
描述:返回参数中第一个Key所关联的Set和其后所有Keys所关联的Sets中成员的差异.
返回值:差异结果成员的集合。
时间复杂度:O(N) N表示所有Sets中成员的总数量
命令格式: sdiff key [key ...]
操作命令如下:
redis 127.0.0.1:6379> smembers my_set_2
1) “test1″
redis 127.0.0.1:6379> smembers my_set
1) “test2″
redis 127.0.0.1:6379> sadd my_set test3
(integer) 1
redis 127.0.0.1:6379> smembers my_set
1) “test3″
2) “test2″
redis 127.0.0.1:6379> sdiff my_set my_set_2
1) “test3″
2) “test2″
redis 127.0.0.1:6379> sdiff my_set_2 my_set
1) “test1″

10: sdiffstore
描述:该命令和SDIFF命令在功能上完全相同,两者之间唯一的差别是SDIFF返回差异的结果成员,而该命令将差异成员存储在destination关联的Set中。如果destination键已经存在,该操作将覆盖它的成员。
返回值:返回差异成员的数量。
时间复杂度:O(N) N表示所有Sets中成员的总数量
命令格式: sdiffstore destination key [key ...]
操作命令如下:
#将2个集合的差异成员存在在my_set_diff关联的Set中,并返回插入的成员数量。
redis 127.0.0.1:6379> sdiff my_set my_set2
1) “test3″
2) “test2″
redis 127.0.0.1:6379> sdiffstore my_set_diff my_set my_set_2
(integer) 2
redis 127.0.0.1:6379> smembers my_set_diff
1) “test3″
2) “test2″

11: sinter
描述:该命令将返回参数中所有Keys关联的Sets中成员的交集。因此如果参数中任何一个Key关联

的Set为空,或某一Key不存在,那么该命令的结果将为空集。
时间复杂度: O(N*M) N表示最小Set中元素的数量,M则表示参数中Sets的数量。
命令格式: sinter key [key ...]
返回值: 交集结果成员的集合
操作命令如下:
redis 127.0.0.1:6379> sinter my_set my_set_diff
1) “test3″
2) “test2″

12: sinterstore
描述:和sinter功能相同,返回交集的结果成员
时间复杂度: O(N*M) N表示最小Set中元素的数量,M则表示参数中Sets的数量。
命令格式: sinterstore destination key [key ...]
返回值:返回交集成员
13:sunion

描述:返回参数中所有Keys关联的Sets中成员的并集。
命令格式: sunion key [key...]
时间复杂度:O(N) N表示所有Sets中成员的总数量
操作命令如下:
redis 127.0.0.1:6379> sunion my_set my_set_2
1) “test3″
2) “test1″
3) “test2″

 
14:sunionstore
描述:与sunion功能相同,返回并集成员的数量。

操作命令如下:
redis 127.0.0.1:6379> sunionstore my_set my_set_2
(integer) 1
redis 127.0.0.1:6379> sunion my_set my_set_2
1) “test1″

作者:唐文博客
记录生活点滴及IT技术分享的博客
原文地址:Nosql之Redis: set数据类型及操作命令, 感谢原作者分享。