redis集合类型详解

集合(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"

时间复杂度

集合类型命令时间复杂度

应用场景

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏蓝天

理解snprintf()函数

在编程中,需要关注snprintf()的两个问题:一是它的返回值,二是它的第二个参数。

462
来自专栏http://www.cnblogs.com

装饰器

一。关于装饰器: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原则:1.不能修改被装饰函数的源代码 2.不能修改被装饰函数的调用方式 二.实现...

2717
来自专栏九彩拼盘的叨叨叨

escape,encodeURI,encodeURIComponent

escape,encodeURI,encodeURIComponent这三个方法都是对URL进行编码的。

632
来自专栏Flutter入门

Kotlin中apply,run,let,also,with函数总结

run函数和apply函数很像,只不过run函数是使用最后一行的返回,apply返回当前自己的对象。

962
来自专栏Java学习网

Java面试题系列之基础部分(三)——每天学5个问题

Java基础部分学习的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法,这些都是最基...

2288
来自专栏coding for love

JS入门难点解析13-属性描述符,数据属性和访问器属性

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

421
来自专栏前端知识分享

第46天:setInterval与setTimeout的区别

js的setTimeout方法用处比较多,通常用在页面刷新了、延迟执行了等等。今天对js的setTimeout方法做一个系统地总结。

761
来自专栏aCloudDeveloper

百炼OJ 2744找相同子串

看到这个题,我首先想的是怎么样找出每一个输入的字符串中相同的子串然后将其保存起来,因为数组是动态输入的,每输入一次都要保存好几次,这个过程势必会很麻烦,突然就一...

1726
来自专栏GreenLeaves

C# static

本文,在大文豪的static与C#中的static随笔基础上修改,增加了几个关键知识点 1、static 关键字简介 static是C#中经常使用的关键字之一,...

1675
来自专栏Golang语言社区

【Go 语言社区】js开发积累

js开发积累 [size=13.3333px] 一、在js中遍历数组与其他语言的不同之处 for(var x in myvars){   alert(myvar...

2847

扫码关注云+社区