第二章:API 的理解和使用-集合
2.5 集合
集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。一个集合最多可以存储4G-1个元素。Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多实际问题。
2.5.1 命令
下面将按照集合内和集合间两个维度对集合的常用命令进行介绍。
- 集合内操作
- 添加元素
sadd key element [element ...]
返回结果为添加成功的元素个数
- 删除元素
srem key element [element ...]
返回结果为成功删除元素个数
- 计算元素个数
scard key
scard的时间复杂度为O(1),它不会遍历集合所有元素,而是直接用Redis内部的变量。
- 判断元素是否在集合中
sismember key element
如果给定元素element在集合内返回1,反之返回0
- 随机从集合返回指定个数元素
srandmember key [count]
[count]是可选参数,如果不写默认为1
- 从集合随机弹出元素
spop key
spop操作可以从集合中随机弹出一个元素
- 获取所有元素
smembers key
smembers和lrange、hgetall都属于比较重的命令,如果元素过多存在阻塞Redis的可能性,这时候可以使用sscan来完成,有关sscan命令2.7节会介绍。
- 集合间操作
- 求多个集合的交集
sinter key [key ...]
- 求多个集合的并集
suinon key [key ...]
- 求多个集合的差集
sdiff key [key ...]
- 将交集、并集、差集的结果保存
sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...]
集合间的运算在元素较多的情况下会比较耗时,所以Redis提供了上面三个命令(原命令+store)将集合间交集、并集、差集的结果保存在destination key中.
2.5.2 内部编码
集合类型的内部编码有两种:ntset(整数集合)和hashtable(哈希表)。
2.5.3 使用场景
集合类型比较典型的使用场景是标签(tag)。例如一个用户可能对娱乐、体育比较感兴趣,另一个用户可能对历史、新闻比较感兴趣,这些兴趣点就是标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验以及增强用户黏度比较重要。例如一个电子商务的网站会对不同标签的用户做不同类型的推荐,比如对数码产品比较感兴趣的人,在各个页面或者通过邮件的形式给他们推荐最新的数码产品,通常会为网站带来更多的利益。
集合类型的应用场景通常为以下几种:
·sadd=Tagging(标签)
·spop/srandmember=Random item(生成随机数,比如抽奖)
·sadd+sinter=Social Graph(社交需求)