前言
Redis 五种基础数据的最后一个了,本想着把 Set 和 Sorted Set 合并成一个来整,但是这样的话整个篇幅又会很长,看我这一篇的篇幅就知道了。又不想好哥哥们看的累(看我多贴心,愣着干嘛,点赞加关注呀)。
这篇完了之后下一篇还是有关于键命令(剧透)的,好哥哥们坚持坚持。下个阶段的话就是像 BitMap、HyperLogLog、Pipeline 等相对于来讲比较高级的功能了,敬请期待吧。
概述
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。Redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储 40 多亿个成员,新学的 Markdown 次方)。如图
List、Set、Sorted Set 对比
1 命令
1.1 集合内操作
1.1.1 添加成员
## 添加成员
zadd key score member [score member ...]
## 向有序集合user:rankings添加用户test和他的分数100
zadd user:rankings 100 test
1.1.2 统计成员个数
## 格式
zcard key
## 统计user:rankings成员个数
zadd user:rankings 100 test
1.1.3 获取某个成员的分数
## 格式
zscore key member
## 获取test分数
zscore user:rankings test
1.1.4 统计成员的排名
## zrank是从分数从低到高返回排名(排名从0开始计算)
zrank key member
## zrevrank是从分数从高到低返回排名(排名从0开始计算)
zrevrank key member
## 从高到低获取返回1
zrank user:rankings test
## 从低到高获取返回0
zrevrank user:rankings test
1.1.5 删除成员
## 格式,支持多个成员
zrem key member [member ...]
## 删除user:ranking中的test
zrem user:rankings test
1.1.6 增加成员的分数
## 格式,increment 需要增加的分数
zincrby key increment member
## 给test添加10
zincrby user:rankings 10 test
1.1.7 回指定排名范围的成员
## 格式,按照分值排名的,zrange是从低到高返回
zrange key start end [withscores]
## 格式,按照分值排名的,zrevrange是从高到低返回
zrevrange key start end [withscores]
## 返回整个有序集成员
zrange user:rankings 0 -1 withscores
## 返回有序集下标区间 1 至 2 的成员和分数
zrange user:rankings 1 2 withscores
1.1.8 返回指定分数范围的成员
## 格式,zrangebyscore按照分数从低到高返回
zrangebyscore key min max [withscores] [limit offset count]
## 格式,zrevrangebyscore 按照分数从高到低返回
zrevrangebyscore key max min [withscores] [limit offset count]
## 从低到高返回100到200的成员
zrangebyscore user:rankings 100 200 withscores
1.1.9 获取指定分数范围成员个数
## 格式
zcount key min max
## 格式,zrevrangebyscore 按照分数从高到低返回
zcount user:rankings 100 200
1.1.10 删除指定排名内的升序元素
## 格式
zremrangebyrank key start end
## 删除第0到第2名的元素
zremrangebyrank user:rankings 0 2
1.1.11 删除指定分数范围的成员
## 格式
zremrangebyscore key min max
## 删除100到200分的成员
zremrangebyscore user:rankings 100 200
1.2 集合间操作
这个的话就不敲范例了,偷个懒(手动狗头保命),基本就是取交集、并集。
1.2.1 交集
## 格式,交集
## destination: 交集计算结果保存到这个键。
## numkeys: 需要做交集计算键的个数。
## key[key...]: 需要做交集计算的键。
## weights weight[weight...]: 每个键的权重,在做交集计算时,每个键中的每个member会将自己分数乘以这个权重,每个键的权重默认是1。
## aggregate sum|min|max: 计算成员交集后,分值可以按照sum(和)、
## min(最小值)、max(最大值)做汇总,默认值是sum
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
1.2.2 并集
## 格式,参数于交集的一致
zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
2 时间复杂度
看图不说话。
3 使用场景
- 标签:比如我们博客网站常常使用到的兴趣标签,把一个个有着相同爱好,关注类似内容的用户利用一个标签把他们进行归并。
- 共同好友功能,共同喜好,或者可以引申到二度好友之类的扩展应用。
- 统计网站的独立 IP。利用 set 集合当中元素不唯一性,可以快速实时统计访问网站的独立 IP。
- 统计用户的点赞/取消点赞
- 排行榜功能,比如展示获取赞数最多的十个用户
本期就到这啦,有不对的地方欢迎好哥哥们评论区留言,另外 求 关 注 、 求 点 赞 \color{#FF0000}{求关注、求点赞} 求关注、求点赞