一、概念和原理

集合是redis中的基本数据类型之一,redis中的集合可以用来存储一堆无序的元素,集合内的元素不会重复,只有存在或者不存在两种属性。

redis集合内部是由intsethashtable实现的,当条件不满足时redis会自动转换内部编码。集合中使用intset的条件:

  1. 集合的所有的元素都是整数
  2. 集合中元素的个数不超过512个

一旦两者的任一条件不满足时,就会转换成hashtable编码。

以下是一个转换示例:

127.0.0.1:6379> sadd data 1 2 3
(integer) 3
127.0.0.1:6379> object encoding data
"intset"
127.0.0.1:6379> sadd data msg
(integer) 1
127.0.0.1:6379> object encoding data
"hashtable"

使用intset编码的优点是节省内存,缺点就是插入、更新和查找等操作相对费时,因为数组元素的更新和插入都无法在O(1)的时间复杂度内完成,而哈希表可以在O(1)时间内完成。

两种不同编码的表现形式

使用intset编码:

使用hashtable

二、集合的操作

2.1 增加元素

SADD key member [member]

返回成功添加的元素个数,如果key不存在会自动创建

示例:

127.0.0.1:6379> sadd data 1 2 3
(integer) 3

2.2 删除元素

SREM key member [member]

返回成功删除的元素个数。

示例:

127.0.0.1:6379> srem data 1
(integer) 1

2.3 获取集合元素

SMEMBERS key

返回集合中的所有元素。

示例:

127.0.0.1:6379> smembers data
1) "2"
2) "3"

2.4 判断元素是否存在

SISMEMBER key member

判断member是否存在于key 中,存在返回1,不存在返回0

示例:

127.0.0.1:6379> sismember data 2
(integer) 1
127.0.0.1:6379> sismember data 1
(integer) 0

2.5 获取集合的元素个数

SCARD key

返回集合中的元素个数,如果集合不存在或者为空返回0。

示例:

127.0.0.1:6379> scard data
(integer) 2
# 获取不存在集合的元素个数
127.0.0.1:6379> scard data1
(integer) 0

2.6 随机返回元素

在集合中随机返回一定数量的元素,默认返回1个:

SRANDMEMBER key [count]
当count<0 时返回的元素可能会重复,当count>0时不会重复。

示例:

# 集合中的所有元素
127.0.0.1:6379> smembers data
1) "1"
2) "2"
3) "3"
# 随机返回两个元素
127.0.0.1:6379> srandmember data 2
1) "1"
2) "3"
# 随机返回三个元素
127.0.0.1:6379> srandmember data -3
1) "3"
2) "1"
3) "3"

2.7 随机移除元素

在集合中随机移除指定数量的元素,返回被移除的元素:

SPOP key [count]

示例:

# 随机移除两个元素
127.0.0.1:6379> spop data 2
1) "1"
2) "2"

2.8 集合间运算

移动一个集合的元素到另外一个集合:

SMOVE src dest item

如果src中包含item元素,移除并添加到dest中去。成功移除返回1,否则返回0

示例:

# 准备两个集合对象
127.0.0.1:6379> smembers stu1
1) "xiaohua"
2) "xiaoming"
127.0.0.1:6379> smembers stu2
1) "xiaohong"
2) "xiaohuang"
# 把stu1中的xiaohong移到stu2中
127.0.0.1:6379> smove stu2 stu1 xiaohong
(integer) 1
# 查看移除结果
127.0.0.1:6379> smembers stu1
1) "xiaohong"
2) "xiaohua"
3) "xiaoming"
127.0.0.1:6379> smembers stu2
1) "xiaohuang"

求差集

求差集有两个命令:

SDIFF key [key ...]
SDIFFSTORE dest key [key...]

第一个是集合间做差值运算,计算存在于第一个集合不存在于其他集合中的元素。

第二个是把存在于第一个集合但不存在于其他集合的元素储存到dest 中,返回元素的个数。

要注意的是这里只会返回存在于第一个集合但是不存在于其他集合的元素,并不会把所有集合的差值都显示出来。

示例:

# 查看两个集合的所有元素
127.0.0.1:6379> smembers stu1
1) "xiaohong"
2) "xiaohua"
3) "xiaoming"
127.0.0.1:6379> smembers stu2
1) "xiaohuang"
# 查看stu1中有stu2中没有的元素
127.0.0.1:6379> sdiff stu1 stu2
1) "xiaohong"
2) "xiaohua"
3) "xiaoming"
# 查看stu2中有stu1中没有的元素
127.0.0.1:6379> sdiff stu2 stu1
1) "xiaohuang"
# 把stu2存在但是在stu1中不存在的元素存到studiff
127.0.0.1:6379> sdiffstore studiff stu2 stu1
(integer) 1
# 打印出studiff的值
127.0.0.1:6379> smembers studiff
1) "xiaohuang"

求交集

SINTER key [key ...]
SINTERSTORE dest key [key ...]

第一个是计算交集,返回两个集合中同时存在的元素。第二个是把交集的结果存到另外一个结果中去。

示例:

# 添加两个集合
127.0.0.1:6379> sadd num1 1 2 3
(integer) 3
127.0.0.1:6379> sadd num2 2 3 4
(integer) 3
# 计算交集
127.0.0.1:6379> sinter num1 num2
1) "2"
2) "3"
# 把交集结果存到nums中去
127.0.0.1:6379> sinterstore nums num1 num2
(integer) 2
127.0.0.1:6379> smembers nums
1) "2"
2) "3"

计算并集

SUNION key [key ...]
SUNION dest key [key ...]

第一个是求并集,返回两个集合中所有的元素。第二个是求并集并把结果保存到dest中。

示例:

# 计算num1和num2中所有的元素
127.0.0.1:6379> sunion num1 num2
1) "1"
2) "2"
3) "3"
4) "4"
最后修改:2020 年 02 月 17 日
如果觉得我的文章对你有用,请随意赞赏