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 为例, 点赞, 收藏, 浏览量, 可能要以不同比重 重新赋值, 再进行排序 …

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值