redis实验环境
针对学习redis 我们可以为您提供一套完善的学习环境
点击此处跳转
章节叙述
本章节我们介绍一下Set
类型,集合(Set
) 类型也是用来保存多个的字符串元素,但是和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,也不是通过索引下标获取元素。如图所示 集合user
: 1: follow
包含着"it"
、 "music"
、 "his"
、 "sports"
四个元素, 一个集合最多可以存储232-1个元素。 Redis
除了支持集合内的增删改查, 同时还支持多个集合取交集、 并集、 差集, 合理地使用好集合类型, 能在实际开发中解决很多实际问题
常用命令
下面将按照集合内和集合之间两个维度对集合的常用命令进行介绍
-
一,集合内操作
-
1,单个添加,查询元素
Redis
提供了sadd
用户添加Set
类型的元素sadd set1 demo1
您可以使用
smembers
命令来返回当前Set
中的所有元素,返回的元素是无序的。smembers set1
*类似
smembers
和List
中的Lrange
,Hash
中的hgetall
都是比较重的命令,如果元素过多的话存在阻塞Redis
的可能性,这时候可以使用scan
来完成,在附件中介绍,可以参考。 -
2,计算元素的个数
使用
scard
可以计算当前集合中的元素的个数scard set1
scard
的时间复杂度为0(1),它不会遍历集合所有元素,而是直接使用Redis
内部的变量 -
3,判断元素是否在集合中
Redis
提供的键是否存在的函数为exists
,同时提供了sismemeber
用于判断集合中是否有指定的元素sismember set1 demo1
如果给定元素
element
在集合内返回1,反之返回0 -
4,随机从集合中返回指定个数的元素
Redis
提供srandmember
从集合中随机返回指定个数的元素srandmember set1 1
-
5,从集合中随机弹出元素
Redis
提供spop
从集合中随机弹出指定个数的元素(注意这里边是弹出就是删除)(最后的个数可以选择不填默认是1个)spop set1 1
-
6,删除元素
Redis
提供的删除键的方法是del
,Redis
提供了srem
用于删除集合中的指定元素(我们先添加一个)sadd set1 demo1 demo2
srem set1 demo1
此方法会返回删除成功的个数
-
-
二,集合间的操作
Redis
提供了多个集合间求交集,并集,差集,以及将这些结果保存的命令,下面我们依次介绍一下-
1,求多个集合的交集
sinter
首先我们先新建两个集合
sadd set4 a h b hb
sadd set5 b e berb rer ebrer
然后我们可以使用
sinter
来得到两个集合的交集sinter set4 set5
-
2,求多个集合的并集
sunion
可以得到多个集合的并集sunion set4 set5
-
3,求多个集合的差集
sdiff
可以得到多个集合的差集,sdiff set4 set5
-
4,将交集、并集、差集的结果保存
sinterstore destination key [key ...] sunionstore destination key [key ...] sdiffstore destination key [key ...]
集合间的运算在元素较多的情况下比较耗时,所以
Redis
提供了上面三个命令,(原命令+ store)将集合间交集,并集,差集的结果保存在destination key
中。我们先执行
sunionstore
方法将结果输出到myset1
中sunionstore myset1 set5 set4
我们查询一样结果是否输出到指定键中
smembers myset1
这里仅仅列举了一个的使用方法,其他两者使用方法一致。
-
内部编码
接下来我们来了解一下Set
类型的内部编码。
集合的内部编码有两种:
intset
( 整数结合 ) :当集合中的元素都是整数且元素个数小于set-max-intset-entries
配置(默认512个)时,Redis
会选用intset
来作为集合的内部实现,从而减少内存的使用。hashtable
( 哈希表):当集合类型无法满足intset
条件时,Redis
会使用hashtable
作为集合的内部实现
使用场景
集合类型比较典型的使用场景是标签(tag)。例如一个用户可能对娱乐、 体育比较感兴趣, 另一个用户可能对历史、 新闻比较感兴趣, 这些兴趣点就是标签。 有了这些数据就可以得到喜欢同一个标签的人, 以及用户的共同喜好的标签, 这些数据对于用户体验以及增强用户黏度比较重要。 例如一个电子商务的网站会对不同标签的用户做不同类型的推荐, 比如对数码产品比较感兴趣的人, 在各个页面或者通过邮件的形式给他们推荐最新的数码产品, 通常会为网站带来更多的利益 。
下面使用集合类型实现标签功能的若干功能示例。大家可以尝试一下。
-
给用户添加标签
sadd user1:tages tag1 tag3
sadd user2:tages tag3 tag3
-
给标签添加用户
sadd tag1 user1 user2 user3
-
删除用户下的标签
srem user1:tages tag1
-
删除标签下的用户
srem tag1 user2 user3
-
计算用户共同感兴趣的标签
sinter user1:tages user2:tages
上述只是给出了使用
Redis
结合类型实现标签的基本思路,实际上会复杂很多,不过集合类型的应用场景通常为以下几种:-
sadd
=Tagging
(标签) -
spop/srandmember
=Random item
(生成随机数,比如抽奖) -
sadd + sinter
=Social Graph
(社交需求)
-