【Redis】Redis Set 集合常见命令, 内部编码以及使用场景介绍
目录
1. 普通命令
SADD
SMEMBERS
SISMEMBER
SCARD
SPOP
SMOVE
SREM
2. 集合间操作
SINTER
SINTERSTORE
SUNION
SUNIONSTORE
SDIFF
SDIFFSTORE
3. 命令小结
4. 内部编码
5. 使用场景
集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中
1)元素之间是无序的
2)元素不允许重复
如下图 示。一个集合中最多可以存储 2^32- 1个元素。Redis 除了支持集合内的增删查改操作,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多问题。
1. 普通命令
SADD
将一个或者多个元素添加到 set 中。注意,重复的元素无法添加到 set 中。
语法:
SADD key member [member ...]
时间复杂度: O(1)
返回值: 本次添加成功的元素个数。
示例:
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 0
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
SMEMBERS
获取一个 set 中的所有元素,注意,元素间的顺序是无序的。
语法:
SMEMBERS key
示例:
时间复杂度: O(N)
返回值: 所有元素的列表。
示例:
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
SISMEMBER
判断一个元素在不在 set 中。
语法:
SISMEMBER key member
时间复杂度: O(1)
返回值: 1表示元素在 set 中。0表示元素不在 set 中或者 key 不存在。
示例:
127.0.0.1:6379> sadd myset "one"
(integer) 1
127.0.0.1:6379> sismember myset "one"
(integer) 1
127.0.0.1:6379> sismember myset "tow"
(integer) 0
SCARD
获取一个 set 的基数(cardinality),即 set 中的元素个数。
语法:
SCARD key
时间复杂度: O(1)
返回值: set内的元素个数。
示例:
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> scard myset
(integer) 2
SPOP
从 set 中删除并返回一个或者多个元素。注意,由于 set 内的元素是无序的,所以取出哪个元素实际是未定义行为,即可以看作随机的。
语法:
SPOP key [count]
时间复杂度: O(N),n是count
返回值:取出的元素。
示例:
127.0.0.1:6379> sadd myset "one" "two" "three"
(integer) 3
127.0.0.1:6379> spop myset
"two"
127.0.0.1:6379> smembers myset
1) "three"
2) "one"
127.0.0.1:6379> sadd myset "four" "five"
(integer) 2
127.0.0.1:6379> spop myset 3
1) "four"
2) "five"
3) "three"
127.0.0.1:6379> smembers myset
1) "one"
SMOVE
将一个元素从源 set 取出并放入目标 set 中。
语法:
SMOVE source destination member
时间复杂度: O(1)
返回值: 1表示移动成功,0表示失败。
示例:
127.0.0.1:6379> sadd myset1 "one" "two"
(integer) 2
127.0.0.1:6379> sadd myset2 "three"
(integer) 1
127.0.0.1:6379> smove myset1 myset2 "two"
(integer) 1
127.0.0.1:6379> smembers myset1
1) "one"
127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
SREM
将指定的元素从 set 中删除。
语法:
SREM key member [member ...]
时间复杂度: O(N), N是要删除的元素个数
返回值: 本次操作删除的元素个数。
示例:
127.0.0.1:6379> sadd myset "one" "two" "three"
(integer) 3
127.0.0.1:6379> srem myset "one"
(integer) 1
127.0.0.1:6379> srem myset "four"
(integer) 0
127.0.0.1:6379> smembers myset
1) "three"
2) "two"
2. 集合间操作
交集(inter)、并集(union)、差集(diff)的概念如图所示。
集合求交集、并集、差集
SINTER
获取给定 set 的交集中的元素。
语法:
SINTER key [key ...]
时间复杂度: O(N*M), N是最小的集合元素个数. M是最大的集合元素个数
返回值: 交集的元素。
示例:
127.0.0.1:6379> sadd key1 "a" "b" "c" "d"
(integer) 4
127.0.0.1:6379> sadd key2 "c" "d" "e" "f"
(integer) 4
127.0.0.1:6379> sinter key1 key2
1) "d"
2) "c"
SINTERSTORE
获取给定 set 的交集中的元素并保存到目标 set 中。
语法:
SINTERSTORE destination key [key ...]
时间复杂度: O(N*M), N是最小的集合元素个数. M 是最大的集合元素个数
返回值: 交集的元素个数。
示例:
127.0.0.1:6379> sadd key1 "a" "b" "c" "d"
(integer) 4
127.0.0.1:6379> sadd key2 "c" "d" "e" "f"
(integer) 4
127.0.0.1:6379> sinterstore key key1 key2
(integer) 2
127.0.0.1:6379> smembers key
1) "c"
2) "d"
SUNION
获取给定 set 的并集中的元素。
语法:
SUNION key [key ...]
时间复杂度: O(N), N给定的所有集合的总的元素个数
返回值: 并集的元素。
示例:
127.0.0.1:6379> sadd key1 "a" "b" "c" "d"
(integer) 4
127.0.0.1:6379> sadd key2 "c" "d" "e" "f"
(integer) 4
127.0.0.1:6379> sunion key1 key2
1) "d"
2) "c"
3) "a"
4) "f"
5) "b"
6) "e"
SUNIONSTORE
获取给定 set 的并集中的元素并保存到目标 set 中。
语法:
SUNIONSTORE destination key [key ...]
时间复杂度: O(N), N给定的所有集合的总的元素个数
返回值: 并集的元素个数。
示例:
127.0.0.1:6379> sadd key1 "a" "b" "c"
(integer) 3
127.0.0.1:6379> sadd key2 "c" "d" "e"
(integer) 3
127.0.0.1:6379> sunionstore key key1 key2
(integer) 5
127.0.0.1:6379> smembers key
1) "c"
2) "a"
3) "d"
4) "b"
5) "e"
SDIFF
获取给定 set 的差集中的元素。
语法:
SDIFF key [key ...]
时间复杂度: O(N), N给定的所有集合的总的元素个数
返回值: 差集的元素。
示例:
127.0.0.1:6379> sadd key1 "a" "b" "c"
(integer) 3
127.0.0.1:6379> sadd key2 "c" "d" "e"
(integer) 3
127.0.0.1:6379> sdiff key1 key2
1) "a"
2) "b"
SDIFFSTORE
获取给定 set 的差集中的元素并保存到目标 set 中。
语法:
SDIFFSTORE destination key [key ...]
时间复杂度:O(N), N给定的所有集合的总的元素个数.
返回值:差集的元素个数。
示例:
127.0.0.1:6379> sadd key1 "a" "b" "c"
(integer) 3
127.0.0.1:6379> sadd key2 "c" "d" "e"
(integer) 3
127.0.0.1:6379> sdiffstore key key1 key2
(integer) 2
127.0.0.1:6379> smembers key
1) "a"
2) "b"
3. 命令小结
小表总结了集合类型的常见命令,开发人员可以根据自身需求进行选择
4. 内部编码
集合类型的内部编码有两种:
1)当元素个数较少并且都为整数时,内部编码为intset:
2)当元素个数超过 512个,内部编码为 hashtable:
3)当存在元素不是整数时,内部编码为 hashtable
5. 使用场景
集合类型比较典型的使用场景是标签(tag)。例如A用户对娱乐、体育板块比较感兴趣,B用户对历史、新闻比较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同一个标签
的人,以及用户的共同喜好的标签,这些数据对于增强用户体验和用户黏度都非常有帮助。例如一个电子商务网站会对不同标签的用户做不同的产品推荐。
下面的演示通过集合类型来实现标签的若干功能。
1) 给用户添加标签
2) 给标签添加用户
3) 删除用户下的标签
4) 删除标签下的用户
5) 计算用户的共同兴趣标签