redis-学习笔记(Zset)

简介: redis-学习笔记(Zset)

Zset 有序集合, 这里的有序是指升序 / 降序

排序的规则是, 给每个 member 引入了一个 score (浮点类型), 根据 score 进行排序

Zset 集合特点: 有序, 唯一 (member 唯一)

其底层数据结构实现有: ziplist , skiplist (跳表)

zadd key [NX | XX] [GT | LT] [INCR] score member [score member ...]

往有序集合中, 添加分数和元素

返回新增成功的元素个数

分数相同, 会按照元素自身字符串字典序来排列


这里的 member 和 score 更像是 C++ 中的 std::pair, 既可以根据 member 找到 score, 也能根据 score 找到 member


XX : 只能修改元素, 不能添加元素

NX : 只能添加元素, 不能修改元素

[XX | NX] 都不添加, 就会产生新的值覆盖旧值, 没有旧值就会新增元素


LT : less than 更新分数, 只有新值比旧值小的时候才能更新

GT : greater than 更新分数, 只有新值比旧值大的时候才能更新


注意, 此操作的 时间复杂度是 O(log(N)), 其他 Hash, Set, List 的插入数据都是 O(1) 的

Zset 内部按照升序方式来排列 (实际实现)


zrange key start end

查看有序集合中的元素详情(因为有序,所以有了下标的概念)


zrange key start end withscore

查看有序集合中的 元素和分数 的详情


zcard key

查看集合元素个数


zcount key min max

查看集合某一区间的元素个数开区间

可用 ( 表示, 用 [ 表示闭区间

记住 括号 只能在元素左侧使用

min 和 max 可以写成浮点数

inf 无穷大, -inf 负无穷大

zrevrange key start end withscores

逆序显示 元素和分数 详情

先逆序, 再选区间


zrangebyscore key min max [withscore]

按照分数来找元素, 和 zcount 类似


zpopmax key [count]

删除并返回分数最高的 count 个元素 (包括 member 和 score)

topK 问题


bzpopmax key [key ...] timeout

阻塞队列 — 删除最大的 count 个元素

每个 key 都是一个 有序集合

timeout 超时时间, 单位是 s , 支持小数形式


zpopmin key [count]

删除有序集合中, 最小的元素


bzpopmin key [key ...] timeout

阻塞队列 — 删除最小的 count 个元素

每个 key 都是一个 有序集合

timeout 超时时间, 单位是 s , 支持小数形式


zrank key member

查询元素的位置 (下标, 升序计算 [正数第几])


zrevrank key member

查询元素的位置 (下标, 倒序计算 [倒数第几])


zscore key member

获取元素对应的 分数


zrem key member [member ...]

根据元素删除元素


zremrangebyrank key start stop

根据 下标 删除指定区间的元素


zremrangebyscore key min max

根据 分数 删除指定区间的元素


zincrby key increment member

修改分数内容

zinter 
zunion 
zdiff
zinterstore
zunionstore
zdiffstore
zinterstore destination numkeys key [key ...] [weights weight[weight ...]] [aggregate <sum | min | max>]

weight 代表权重

aggregate 代表以什么样的结果呈现 (求和, 最大值, 最小值)


粘包问题

tcp 使用数据报发送数据, 但是当多个包传过来后, 后一个包的头紧贴着前一个包的尾, 造成的数据包之间不好区分

如何解决?

  1. 明确包的长度
  2. 明确包的边界
    具体实现方式有很多

Zset 应用场景

最常用 ---- 排行榜系统

普通游戏排行榜, 可能只需要根据分数来排序

像 csdn 排行榜, 微博热搜排行榜, 可能就需要综合考虑

以 scdn 为例, 点赞, 收藏, 浏览量, 可能要以不同比重 重新赋值, 再进行排序 …

目录
相关文章
|
NoSQL Java Redis
redis-学习笔记(Jedis 通用命令)
redis-学习笔记(Jedis 通用命令)
145 1
|
消息中间件 存储 负载均衡
Redis使用ZSET实现消息队列使用总结二
Redis使用ZSET实现消息队列使用总结二
324 0
|
存储 NoSQL Redis
投行系统的毫秒级榜单响应:如何用Redis ZSET破解同分排序难题?
通过Redis的ZSET数据结构和更新时间戳,解决投行交易系统实时排行榜中同分跳变的问题。具体方案为:将交易量作为整数部分,更新时间戳作为小数部分,确保同分时按最新更新排序,实现实时、高效、无需应用层干预的排行榜功能。一句话总结:通过Redis ZSET加更新时间戳,解决百万交易排行榜实时显示及同分难题。
|
存储 JSON NoSQL
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
这篇文章是关于Redis基本数据结构的学习笔记,包括了String、Hash、Set、List和SortedSet的介绍和常用命令。文章解释了每种数据结构的特点和使用场景,并通过命令示例演示了如何在Redis中操作这些数据结构。此外,还提供了一些练习示例,帮助读者更好地理解和应用这些数据结构。
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
|
存储 NoSQL 算法
深入理解Redis数据类型Zset原理
本文深入探讨了Redis中的Zset(有序集合)数据类型,它是一种可以存储排序功能的集合,其中每个元素都具有一个浮点型的score属性,用于根据score进行排序。
深入理解Redis数据类型Zset原理
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
NoSQL Redis 索引
Redis 中ZSET数据类型命令使用及对应场景总结
Redis 中ZSET数据类型命令使用及对应场景总结
422 2
|
存储 NoSQL API
7)深度解密 Redis 的有序集合(ZSet)
7)深度解密 Redis 的有序集合(ZSet)
448 0