推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
Redis——》数据类型:zset(有序集合)
- 一、简介
- 二、应用场景
- 三、底层结构
- 四、操作示例
- (1)增
- (2)删
- (3)改
- (4)查
- (5)计算
- 五、排序是怎么实现的?
一、简介
已排序的字符串集合,同时元素不能重复
每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
二、应用场景
排行榜,社交需求(如用户点赞)
三、底层结构
ziplist(压缩列表)、skiplist(跳跃表)
四、操作示例
(1)增
语法 | 示例 | 描述 |
---|---|---|
zadd key score1 member1 [score2 member2] | zadd k1 1 a 2 b | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
(2)删
语法 | 示例 | 描述 |
---|---|---|
zrem key member [member …] | zrem k1 a b | 移除有序集合中的一个或多个成员 |
zremrangebylex key min max | zremrangebylex k1 0 1 | 移除有序集合中给定的字典区间的所有成员 |
zremrangebyrank key start stop | zremrangebyrank k1 0 1 | 移除有序集合中给定的排名区间的所有成员 |
zremrangebyscore key min max | zremrangebyscore k1 0 10 | 移除有序集合中给定的分数区间的所有成员 |
(3)改
见增
(4)查
语法 | 示例 | 描述 |
---|---|---|
zcard key | zcard k1 | 获取有序集合的成员数 |
zrange key start stop [WITHSCORES] | zrange k1 0 1 | 通过索引区间返回有序集合成指定区间内的成员 |
zrangebylex key min max [LIMIT offset count] | zrangebylex k1 0 1 | 通过字典区间返回有序集合的成员 |
zrangebyscore key min max [WITHSCORES] [LIMIT] | zrangebyscore k1 0 10 | 通过分数返回有序集合指定区间内的成员 |
zrank key member | zrank k1 a | 返回有序集合中指定成员的索引 |
zrevrange key member | zrevrange k1 a | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
zscore key member | zscore k1 a | 返回有序集中,成员的分数值 |
zrevrange key start stop [WITHSCORES] | zrevrange k1 0 1 | 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
zrevrangebyscore key max min [WITHSCORES] | zrevrangebyscore k1 0 10 | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
zscan key cursor [MATCH pattern] [COUNT count] | zscan k1 cursor | 迭代有序集合中的元素(包括元素成员和元素分值) |
(5)计算
语法 | 示例 | 描述 |
---|---|---|
zcount key min max | zcount k1 0 10 | 计算在有序集合中指定区间分数的成员数 |
zincrby key increment member | zincrby k1 1 a | 有序集合中对指定成员的分数加上增量 increment |
zinterstore destination numkeys key [key …] | zinterstore destkey k1 k2 | 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 |
zlexcount key min max | zlexcount k1 0 10 | 在有序集合中计算指定字典区间内成员数量 |
zunionstore destination numkeys key [key …] | zunionstore destkey k1 k2 | 计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
help @zset
# zadd key score member
zadd k1 8 apple 2 banana 3 orange
# 分值排序,按索引查询
zrange k1 0 -1
# 分值排序,按索引查询
zrange k1 0 -1 with sroce
# 分值排序,按分值查询
zrangebyscore k1 3 8
# 分值排序,从小到大取前2个
zrange k1 0 1
# 分值排序,从大到小取前2个
zrerange k1 0 1
# 通过元素取出分值
zscore k1 apple
# 通过元素取出排名
zrank k1 apple
# 元素增加分值
zincrby k1 2.5 banana
# 歌曲排行榜(下载、点击、播放)
zadd k1 80 tom 60 sean 70 baby
zadd k2 60 tom 100 sean 40 yiming
# 相同元素默认相加
zunionstore unkey 2 k1 k2
zrange unkey 0 -1 withscores
# k1权重为1,k2权重为0.5
zunionstore unkey 2 k1 k2 weights 1 0.5
zrange unkey 0 -1 withscores
# 相同元素取最大值
zunionstore unkey 2 k1 k2 aggregate max
zrange unkey 0 -1 withscores