image.png

    集合( set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,
不能通过索引下标获取元素。

    一个集合最多可以存储232次方-1个元素。Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集,合理地
使用好集合类型,能在实际开发中解决很多实际问题。

对Set类型的操作命令
1、sadd:添加元素,允许添加多个,返回结果为添加成功的元素个数,格式:sadd key member [member…]

   127.0.0.1:6379> sadd myset v1 v2 v3
   (integer) 3
   127.0.0.1:6379> sadd myset v1
   (integer) 0

2、smembers:获取集合中所有元素(不会弹出元素),格式:SMEMBERS key

	127.0.0.1:6379> SMEMBERS myset
	1) "v2"
	2) "v1"
	3) "v3"

3、sismember:判断元素是否在集合中,格式:SISMEMBER key member (member具体的值)

	127.0.0.1:6379> SISMEMBER myset v1
	(integer) 1
	127.0.0.1:6379> SISMEMBER myset v12
	(integer) 0

4、srem:删除元素,格式:srem key member [member…]

	127.0.0.1:6379> SREM myset v1
	(integer) 1
	127.0.0.1:6379> SREM myset v2 v3
	(integer) 2

5、scard:获取集合中元素的个数,格式是:scard key

	127.0.0.1:6379> sadd myset v1 v2 v3
	(integer) 3
	127.0.0.1:6379> SCARD myset
	(integer) 3

6、srandmember(随机事件):随机获取集合中的元素,格式:srandmember key count (count数量为正数时,会随机获取这么多个不重复的元素;如果数量大于集合元素个数,返回全部;如果数量为负,会随机获取这么多个元素,可能有重复。如果为0不返回结果)

	127.0.0.1:6379> SADD k1 1 2 3 4 5 
	(integer) 5
	127.0.0.1:6379> SRANDMEMBER k1 10
	1) "1"
	2) "2"
	3) "3"
	4) "4"
	5) "5"
	127.0.0.1:6379> SRANDMEMBER k1 3
	1) "3"
	2) "5"
	3) "1"
	127.0.0.1:6379> SRANDMEMBER k1 -8
	1) "4"
	2) "5"
	3) "4"
	4) "3"
	5) "5"
	6) "2"
	7) "5"
	8) "4"
	127.0.0.1:6379> SRANDMEMBER k1 0
	(empty list or set)

7、spop(随机事件):随机弹出元素(从列表移除),srandmember不会,格式:spop key

	127.0.0.1:6379> SADD myset v1 v2 v3 v4
	(integer) 4
	127.0.0.1:6379> SPOP myset 1
	1) "v3"
	127.0.0.1:6379> SPOP myset 1
	1) "v4"
	127.0.0.1:6379> SMEMBERS myset
	1) "v2"
	2) "v1"

8、smove:移动元素。格式是:smove source destination member(destination 为目标key 一次只能移动一个,member是具体的数据)

    127.0.0.1:6379> SADD myset v1 v2 v3 v4
	(integer) 4
	127.0.0.1:6379> SMOVE myset myset2 v3
	(integer) 1
	127.0.0.1:6379> SMOVE myset myset2 v2
	(integer) 1
	127.0.0.1:6379> SMOVE myset myset2 v10   不存在返回0
	(integer) 0
	127.0.0.1:6379> SMEMBERS myset
	1) "v1"
	2) "v4"
	127.0.0.1:6379> SMEMBERS myset2
	1) "v2"
	2) "v3"

集合间操作命令

1、sinter:交集,返回多个key里面都有的项。格式:sinter key [key …]

	127.0.0.1:6379> SADD myset v1 v2 v3 v4
	(integer) 4
	127.0.0.1:6379> SADD myset2 v3 v4 v5 v6
	(integer) 4
	127.0.0.1:6379> SINTER myset myset2
	1) "v4"
	2) "v3"

2、 sinterstore:交集并保留结果。格式:sinterstore destination key [key …] 获取指定一个或多个key的交集并存放到destination 中( destination 为目标key)。

	127.0.0.1:6379> SADD myset v1 v2 v3 v4
	(integer) 4
	127.0.0.1:6379> SADD myset2 v3 v4 v5 v6
	(integer) 4
	127.0.0.1:6379> SINTERSTORE my myset
	(integer) 4
	127.0.0.1:6379> SMEMBERS my
	1) "v1"
	2) "v2"
	3) "v4"
	4) "v3"
	127.0.0.1:6379> SINTERSTORE my2 myset myset2
	(integer) 2
	127.0.0.1:6379> SMEMBERS my2
	1) "v4"
	2) "v3"

11、sunion:并集。格式:sunion key [key …] 返回一个或多个key共同存在的,并且不重复

	127.0.0.1:6379> SADD myset v1 v2 v3 v4
	(integer) 4
	127.0.0.1:6379> SADD myset2 v3 v4 v5 v6
	(integer) 4
	127.0.0.1:6379> SUNION myset myset2
	1) "v2"
	2) "v1"
	3) "v6"
	4) "v4"
	5) "v3"
	6) "v5"

12、sunionstore:并集并保留结果。格式:sunionstore destination key [key …] 获取指定一个或多个key的交集并存放到destination 中( destination 为目标key)。。

	127.0.0.1:6379> SADD myset v1 v2 v3 v4
	(integer) 4
	127.0.0.1:6379> SADD myset2 v3 v4 v5 v6
	(integer) 4
	127.0.0.1:6379> SUNIONSTORE my3 myset myset2
	(integer) 6
	127.0.0.1:6379> smembers my3
	1) "v2"
	2) "v1"
	3) "v6"
	4) "v4"
	5) "v3"
	6) "v5"

13、sdiff:差集,返回在第一个key里面而不在后面任何一个key里面的项。格式是:sdiff key [key…]

	127.0.0.1:6379> SADD myset v1 v2 v3 v4
	(integer) 4
	127.0.0.1:6379> SADD myset2 v3 v4 v5 v6
	(integer) 4
	127.0.0.1:6379> SDIFF  myset myset2
	1) "v1"
	2) "v2"
	127.0.0.1:6379> SDIFF  myset2 myset
	1) "v6"
	2) "v5"

14、sdiffstore:差集并保留结果,返回在第一个key里面而不在后面任何一个key里面的项,
格式:sdiffstore destination key [key …] 获取指定一个或多个key的差集集并存放到destination 中( destination 为目标key)。

	127.0.0.1:6379> SADD myset v1 v2 v3 v4
	(integer) 4
	127.0.0.1:6379> SADD myset2 v3 v4 v5 v6
	(integer) 4
	127.0.0.1:6379> SDIFFSTORE my4 myset myset2
	(integer) 2
	127.0.0.1:6379> SMEMBERS my4
	1) "v1"
	2) "v2"
	127.0.0.1:6379> SDIFFSTORE my5  myset2 myset
	(integer) 2
	127.0.0.1:6379> SMEMBERS my5
	1) "v6"
	2) "v5"

15、SSCAN key cursor [MATCH pattern] [COUNT count] :迭代集合中的元素

	127.0.0.1:6379> SADD myset A
	(integer) 1
	127.0.0.1:6379> SADD myset B
	(integer) 1
	127.0.0.1:6379> SADD myset C
	(integer) 1
	127.0.0.1:6379> SADD myset BB
	(integer) 1
	127.0.0.1:6379> SMEMBERS myset
	1) "BB"
	2) "B"
	3) "A"
	4) "C"
	127.0.0.1:6379> SSCAN myset 0 match B*
	1) "0"
	2) 1) "BB"
	   2) "B"
使用场景

集合类型比较典型的使用场景是标签(tag)。例如一个用户可能对娱乐、体育比较感兴趣,另一个用户可能对历史、新闻比较感兴趣,这些兴趣点就是标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验以及增强用户黏度比较重要。

例如一个电子商务的网站会对不同标签的用户做不同类型的推荐,比如对数码产品比较感兴趣的人,在各个页面或者通过邮件的形式给他们推荐最新的数码产品,通常会为网站带来更多的利益。

除此之外,集合还可以通过生成随机数进行比如抽奖活动,以及社交图谱等等。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐