×
广告

redis集合类型详解

96
塞亚猫 22d8d123 271c 4d80 9c59 6990844a9e37
2017.12.12 10:32 字数 554

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

redis除了支持集合内的增删改查,同时还支持多个集合取交集,并集,差集

集合内操作

添加元素

sadd key element [element ...]

返回结果为添加成功的元素个数

127.0.0.1:6379> sadd myset a b c
(integer) 3
127.0.0.1:6379> sadd myset a b
(integer) 0

删除元素

srem key element [element ...]

返回结果为成功删除元素个数

127.0.0.1:6379> srem myset a b
(integer) 2
127.0.0.1:6379> srem myset hello
(integer) 0

计算元素个数

scard key

127.0.0.1:6379> scard myset
(integer) 1

判断元素是否在集合中

sismember key element

如果元素存在返回1,不存在返回0

127.0.0.1:6379> sismember myset c
(integer) 1
127.0.0.1:6379> sismember myset d
(integer) 0

随机从集合中返回指定个数元素

srandmember key [count]

[count]默认为1

127.0.0.1:6379> sadd myset a b c d e f g
(integer) 6
127.0.0.1:6379> srandmember myset 2
1) "d"
2) "e"
127.0.0.1:6379> srandmember myset
"f"

从集合随机弹出元素

spop key

从集合中随机弹出一个元素

127.0.0.1:6379> spop myset
"b"
127.0.0.1:6379> spop myset
"g"

srandmember和spop都是随机从集合选出元素,不同之处在于,spop会将元素从集合中弹出

获取所有元素

smembers key

返回的结果是无序的

127.0.0.1:6379> smembers myset
1) "d"
2) "c"
3) "e"
4) "a"
5) "f"

smembers和lrange, hgetall都属于比较重的命令,如果元素过多,有可能阻塞

集合间操作

创建两个集合

127.0.0.1:6379> sadd user:1:follow it music his sports
(integer) 4
127.0.0.1:6379> sadd user:2:follow it news ent sports
(integer) 4

求集合间交集

sinter key [key ...]

127.0.0.1:6379> sinter user:1:follow user:2:follow
1) "it"
2) "sports"

求多个集合的并集

suinon key [key ...]

127.0.0.1:6379> sunion user:1:follow user:2:follow
1) "ent"
2) "his"
3) "it"
4) "sports"
5) "news"
6) "music"

求多个集合的差集

sdiff key [key ...]

127.0.0.1:6379> sdiff user:1:follow user:2:follow
1) "his"
2) "music"

保存集合运算的结果

集合的运算过程是比较耗时的,如果需要重复用到运算结果,就很有必要将结果存储起来。以下命令将集合间的交集、并集、差集结果保存到另一个集合中

sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...]

127.0.0.1:6379> sinterstore user:1_2:inter user:1:follow user:2:follow
(integer) 2
127.0.0.1:6379> type user:1_2:inter
set
127.0.0.1:6379> smembers user:1_2:inter
1) "it"
2) "sports"

127.0.0.1:6379> sunionstore user:1_2:union user:1:follow user:2:follow
(integer) 6
127.0.0.1:6379> smembers user:1_2:union
1) "ent"
2) "his"
3) "it"
4) "sports"
5) "news"
6) "music"

127.0.0.1:6379> sdiffstore user:1_2:diff user:1:follow user:2:follow
(integer) 2
127.0.0.1:6379> smembers user:1_2:diff
1) "his"
2) "music"

时间复杂度

集合类型命令时间复杂度

应用场景

集合类型的典型应用场景是标签。如文章标签:一篇文章可以有多个标签,每个标签都不相同,不同文章的标签可相同,也可不同。文章之间可能标签可以进行归类筛选

同理,社交或电商网站给用户添加标签(兴趣、爱好等),也是集合的经典应用场景

编程
Web note ad 1