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 条评论
登录 后参与评论

相关文章

来自专栏進无尽的文章

基础篇-ObjectC继承、类别、属性

    在实际的开发过程中,继承和类别都会得到很多用处。对于界面相似度很高的情况下,使用继承可以节省很多代码和设置,只需要在子类中重写父类中的方法,或者增加新的...

631
来自专栏前端侠2.0

大白话讲解Promise(一)一文 的学习+新领悟

1、Promise是一个构造函数,自己身上有all、reject、resolve、then、catch。。。。。

1612
来自专栏Create Sun

python 3.x 爬虫基础---正则表达式(案例:爬取猫眼信息,写入txt,csv,下载图片)

  正则表达式是对字符串的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则的字符串”,此字符串用来表示对字符串的一种“过滤”逻辑。...

2384
来自专栏pangguoming

理解闭包 js回收机制

为什么要有回收机制?why? 打个比方,我有一个内存卡,这个内存是8G的,我把文件,视频,音乐,都保存到了这个内存卡,随着我的储存的内容越来越多,这个内存卡已经...

3887
来自专栏技术博文

JQuery处理json与ajax返回JSON实例

json数据是一种经型的实时数据交互的数据存储方法,使用到最多的应该是ajax与json配合使用了,下面我来给大家介绍jquery处理json数据方法。 JSO...

3666
来自专栏Golang语言社区

【Go 语言社区】go 学习中遇到一些语法问题

1.可变参数,传入数组的饿时候,必须加三个... func sums(nums ...int){} nums := []int{1, 2, 3, 4, 5}...

34711
来自专栏Kevin-ZhangCG

[ Java面试题 ]泛型篇

1995
来自专栏程序你好

在C#中用Var 和 Dynamic声明变量的区别

C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,但其实它们是有本质的区别的。

701
来自专栏余生开发

EditorConfig 的配置

# EditorConfig文件使用INI格式。斜杠(/)作为路径分隔符,#或者;作为注释。路径支持通配符:

1594
来自专栏我是业余自学C/C++的

strlen()

1413

扫码关注云+社区