Set(集合)
redis的set是string类型的无序集合。
set元素最大可以包含(2的32次方-1)个元素。
关于set集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union)
,交集(intersection)
,差集(difference)
。通过这些操作可以很容易的实现sns中的好友推荐功能。
目录:
1.SADD
2.SCARD
3.SDIFF
4.SDIFFSTORE
5.SINTER
6.SINTERSTORE
7.SISMEMBER
8.SMEMBERS
9.SMOVE
10.SPOP
1.SADD
SADD key member [member ...]
将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略。
假如key不存在,则创建一个只包含member元素作成员的集合。
当key不是集合类型时,返回一个错误。
# 添加单个元素
redis> SADD bbs "discuz.net"
(integer) 1
# 添加重复元素
redis> SADD bbs "discuz.net"
(integer) 0
# 添加多个元素
redis> SADD bbs "tianya.cn" "groups.google.com"
(integer) 2
redis> SMEMBERS bbs
1) "discuz.net"
2) "groups.google.com"
3) "tianya.cn"
2.SCARD
SCARD key
返回集合key的基数(集合中元素的数量)。
返回值:
集合的基数。
当key不存在时,返回0。
redis> SADD tool pc printer phone
(integer) 3
redis> SCARD tool # 非空集合
(integer) 3
redis> DEL tool
(integer) 1
redis> SCARD tool # 空集合
(integer) 0
3.SDIFF
SDIFF key [key ...]
返回一个集合的全部成员,该集合是所有给定集合之间的差集。
不存在的key被视为空集。
返回值:
一个包含差集成员的列表。
redis> SMEMBERS peter's_movies
1) "bet man"
2) "start war"
3) "2012"
redis> SMEMBERS joe's_movies
1) "hi, lady"
2) "Fast Five"
3) "2012"
redis> SDIFF peter's_movies joe's_movies
1) "bet man"
2) "start war"
SDIFFSTORE destination key [key ...]
这个命令的作用和 SDIFF 类似,但它将结果保存到destination
集合,而不是简单地返回结果集。
如果destination集合已经存在,则将其覆盖。
destination可以是key本身。
返回值:
结果集中的元素数量。
redis> SMEMBERS joe's_movies
1) "hi, lady"
2) "Fast Five"
3) "2012"
redis> SMEMBERS peter's_movies
1) "bet man"
2) "start war"
3) "2012"
redis> SDIFFSTORE joe_diff_peter joe's_movies peter's_movies
(integer) 2
redis> SMEMBERS joe_diff_peter
1) "hi, lady"
2) "Fast Five"
5.SINTER
SINTER key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的交集。
不存在的key被视为空集。
当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。
返回值:
交集成员的列表。
redis> SMEMBERS group_1
1) "LI LEI"
2) "TOM"
3) "JACK"
redis> SMEMBERS group_2
1) "HAN MEIMEI"
2) "JACK"
redis> SINTER group_1 group_2
1) "JACK"
SINTERSTORE destination key [key ...]
这个命令类似于 SINTER 命令,但它将结果保存到destination集合,而不是简单地返回结果集。
如果destination集合已经存在,则将其覆盖。
destination可以是key本身。
返回值:
结果集中的成员数量。
redis> SMEMBERS songs
1) "good bye joe"
2) "hello,peter"
redis> SMEMBERS my_songs
1) "good bye joe"
2) "falling"
redis> SINTERSTORE song_interset songs my_songs
(integer) 1
redis> SMEMBERS song_interset
1) "good bye joe"
SISMEMBER key member
判断member元素是否集合key的成员。
返回值:
如果member元素是集合的成员,返回1。
如果member元素不是集合的成员,或key不存在,返回0。
redis> SMEMBERS joe's_movies
1) "hi, lady"
2) "Fast Five"
3) "2012"
redis> SISMEMBER joe's_movies "bet man"
(integer) 0
redis> SISMEMBER joe's_movies "Fast Five"
(integer) 1
8.SMEMBERS
SMEMBERS key
返回集合key中的所有成员。
不存在的key被视为空集合。
返回值:
集合中的所有成员。
# key不存在或集合为空
redis> EXISTS not_exists_key
(integer) 0
redis> SMEMBERS not_exists_key
(empty list or set)
# 非空集合
redis> SADD language Ruby Python Clojure
(integer) 3
redis> SMEMBERS language
1) "Python"
2) "Ruby"
3) "Clojure"
9.SMOVE
SMOVE source destination member
将member元素从source集合移动到destination集合。
SMOVE 是原子性操作。
如果source集合不存在或不包含指定的member元素,则 SMOVE 命令不执行任何操作,仅返回0。否则,member元素从source集合中被移除,并添加到destination集合中去。
当destination集合已经包含member
元素时, SMOVE 命令只是简单地将source
集合中的member元素删除。
当source或destination不是集合类型时,返回一个错误。
返回值:
如果member元素被成功移除,返回1。
如果member元素不是source集合的成员,并且没有任何操作对destination
集合执行,那么返回0。
redis> SMEMBERS songs
1) "Billie Jean"
2) "Believe Me"
redis> SMEMBERS my_songs
(empty list or set)
redis> SMOVE songs my_songs "Believe Me"
(integer) 1
redis> SMEMBERS songs
1) "Billie Jean"
redis> SMEMBERS my_songs
1) "Believe Me"
10.SPOP
SPOP key
移除并返回集合中的一个随机元素。如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。
返回值:
被移除的随机元素。
当key不存在或key是空集时,返回nil。
redis> SMEMBERS db
1) "MySQL"
2) "MongoDB"
3) "Redis"
redis> SPOP db
"Redis"
redis> SMEMBERS db
1) "MySQL"
2) "MongoDB"
redis> SPOP db
"MySQL"
redis> SMEMBERS db
1) "MongoDB"