目录
集合类型是保存多个字符串类型的元素的,但和列表类型不同的是,集合中元素之间是⽆序的,且元素不允许重复。⼀个集合中最多可以存储 个元素。
Redis 除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实际开发中解决很多问题。
SADD
将⼀个或者多个元素添加到 set 中。注意,重复的元素⽆法添加到 set 中。
语法
时间复杂度:O(1) 返回值:本次添加成功的元素个数。 举例SADD key member [member ...]
redis> SADD myset "Hello" (integer) 1 redis> SADD myset "World" (integer) 1 redis> SADD myset "World" (integer) 0 redis> SMEMBERS myset 1) "Hello" 2) "World"
SMEMEBERS
获取⼀个 set 中的所有元素,注意,元素间的顺序是⽆序的。
语法
SMEMBERS key时间复杂度:O(N) 返回值:所有元素的列表。 举例
redis> SADD myset "Hello" (integer) 1 redis> SADD myset "World" (integer) 1 redis> SMEMBERS myset 1) "Hello" 2) "World"
SISMEMBER
判断⼀个元素在不在 set 中。语法
SISMEMBER key member时间复杂度:O(1) 返回值:1 表⽰元素在 set 中。0 表⽰元素不在 set 中或者 key 不存在。 举例
redis> SADD myset "one" (integer) 1 redis> SISMEMBER myset "one" (integer) 1 redis> SISMEMBER myset "two" (integer) 0
SCARD
获取⼀个 set 的基数(cardinality),即 set 中的元素个数。语法
SCARD key时间复杂度:O(1) 返回值:set 内的元素个数。 举例
redis> SADD myset "Hello" (integer) 1 redis> SADD myset "World" (integer) 1 redis> SCARD myset (integer) 2
SPOP
从 set 中删除并返回⼀个或者多个元素。注意,由于 set 内的元素是⽆序的,所以取出哪个元素实际是未定义⾏为,即可以看作随机的。
语法
SPOP key [count]时间复杂度:O(N), n 是 count 返回值:取出的元素。 举例
redis> SADD myset "one" (integer) 1 redis> SADD myset "two" (integer) 1 redis> SADD myset "three" (integer) 1 redis> SPOP myset "two" redis> SMEMBERS myset 1) "one" 2) "three" redis> SADD myset "four" (integer) 1 redis> SADD myset "five" (integer) 1 redis> SPOP myset 3 1) "one" 2) "three" 3) "four" redis> SMEMBERS myset 1) "five"
SMOVE
将⼀个元素从源 set 取出并放⼊⽬标 set 中。
语法
时间复杂度:O(1) 返回值:1 表⽰移动成功,0 表⽰失败。 举例SMOVE source destination member
redis> SADD myset "one" (integer) 1 redis> SADD myset "two" (integer) 1 redis> SADD myotherset "three" (integer) 1 redis> SMOVE myset myotherset "two" (integer) 1 redis> SMEMBERS myset 1) "one" redis> SMEMBERS myotherset 1) "three" 2) "two"
SREM
将指定的元素从 set 中删除。
语法
时间复杂度:O(N), N 是要删除的元素个数. 返回值:本次操作删除的元素个数。 举例SREM key member [member ...]
redis> SADD myset "one" (integer) 1 redis> SADD myset "two" (integer) 1 redis> SADD myset "three" (integer) 1 redis> SREM myset "one" (integer) 1 redis> SREM myset "four" (integer) 0 redis> SMEMBERS myset 1) "two" 2) "three"
SINTER
获取给定 set 的交集中的元素。
语法
SINTER key [key ...]时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数. 返回值:交集的元素。 举例
redis> SADD key1 "a" (integer) 1 redis> SADD key1 "b" (integer) 1 redis> SADD key1 "c" (integer) 1 redis> SADD key2 "c" (integer) 1 redis> SADD key2 "d" (integer) 1 redis> SADD key2 "e" (integer) 1 redis> SINTER key1 key2 1) "c"
SINTERSTORE
获取给定 set 的交集中的元素并保存到⽬标 set 中。
语法
SINTERSTORE destination key [key ...]时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数. 返回值:交集的元素个数。 举例
redis> SADD key1 "a" (integer) 1 redis> SADD key1 "b" (integer) 1 redis> SADD key1 "c" (integer) 1 redis> SADD key2 "c" (integer) 1 redis> SADD key2 "d" (integer) 1 redis> SADD key2 "e" (integer) 1 redis> SINTERSTORE key key1 key2 (integer) 1 redis> SMEMBERS key 1) "c"
SUNION
获取给定 set 的并集中的元素。
语法
SUNION key [key ...]时间复杂度:O(N), N 给定的所有集合的总的元素个数. 返回值:并集的元素。 举例
redis> SADD key1 "a" (integer) 1 redis> SADD key1 "b" (integer) 1 redis> SADD key1 "c" (integer) 1 redis> SADD key2 "c" (integer) 1 redis> SADD key2 "d" (integer) 1 redis> SADD key2 "e" (integer) 1 redis> SUNION key1 key2 1) "a" 2) "b" 3) "c" 4) "d" 5) "e"
SUNIONSTORE
获取给定 set 的并集中的元素并保存到⽬标 set 中。语法
SUNIONSTORE destination key [key ...]时间复杂度:O(N), N 给定的所有集合的总的元素个数. 返回值:并集的元素个数。 举例
redis> SADD key1 "a" (integer) 1 redis> SADD key1 "b" (integer) 1 redis> SADD key1 "c" (integer) 1 redis> SADD key2 "c" (integer) 1 redis> SADD key2 "d" (integer) 1 redis> SADD key2 "e" (integer) 1 redis> SUNIONSTORE key key1 key2 (integer) 5 redis> SMEMBERS key 1) "a" 2) "b" 3) "c" 4) "d" 5) "e"
SDIFF
获取给定 set 的差集中的元素。语法
SDIFF key [key ...]时间复杂度:O(N), N 给定的所有集合的总的元素个数. 返回值:差集的元素。 举例
redis> SADD key1 "a" (integer) 1 redis> SADD key1 "b" (integer) 1 redis> SADD key1 "c" (integer) 1 redis> SADD key2 "c" (integer) 1 redis> SADD key2 "d" (integer) 1 redis> SADD key2 "e" (integer) 1 redis> SDIFF key1 key2 1) "a" 2) "b"
SDIFFSTORE
获取给定 set 的差集中的元素并保存到⽬标 set 中。语法
SDIFFSTORE destination key [key ...]时间复杂度:O(N), N 给定的所有集合的总的元素个数. 返回值:差集的元素个数。 举例
redis> SADD key1 "a" (integer) 1 redis> SADD key1 "b" (integer) 1 redis> SADD key1 "c" (integer) 1 redis> SADD key2 "c" (integer) 1 redis> SADD key2 "d" (integer) 1 redis> SADD key2 "e" (integer) 1 redis> SDIFFSTORE key key1 key2 (integer) 2 redis> SMEMBERS key 1) "a" 2) "b"
内部编码
集合类型的内部编码有两种:
• intset(整数集合):当集合中的元素都是整数并且元素的个数⼩于 set-max-intset-entries 配置(默认 512 个)时,Redis 会选⽤ intset 来作为集合的内部实现,从⽽减少内存的使⽤。
• hashtable(哈希表):当集合类型⽆法满⾜ intset 的条件时,Redis 会使⽤ hashtable 作为集合的内部实现。
1)当元素个数较少并且都为整数时,内部编码为 intset:
2)当元素个数超过 512 个,内部编码为 hashtable:127.0.0.1:6379> sadd setkey 1 2 3 4
(integer) 4
127.0.0.1:6379> object encoding setkey
"intset"
127.0.0.1:6379> sadd setkey 1 2 3 43)当存在元素不是整数时,内部编码为 hashtable:
(integer) 513
127.0.0.1:6379> object encoding setkey
"hashtable"
127.0.0.1:6379> sadd setkey a
(integer) 1
127.0.0.1:6379> object encoding setkey
"hashtable"
应用场景
1.标签系统
在社交网络、博客或新闻网站中,可以使用Redis Set存储具有相同标签的文章或用户。
标签系统可以用于信息分类和组织,方便进行标签搜索和统计。
2.好友关系
在社交网络应用中,可以使用Redis Set存储用户的好友列表。
通过交集、并集等操作,可以实现好友推荐、共同好友查找等功能。
3.实时排行榜
标签:Set,SADD,Redis,myset,redis,详解,key,integer,元素 From: https://blog.csdn.net/wmh_1234567/article/details/144489091在在线游戏或竞技场景中,可以使用Redis Set(或更常用的有序集合Sorted Set)存储玩家的得分。
通过定期更新玩家的得分并将其添加到排行榜集合中,可以实时获取当前排名。