redis-学习笔记(Zset)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 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 为例, 点赞, 收藏, 浏览量, 可能要以不同比重 重新赋值, 再进行排序 …

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
30天前
|
NoSQL Java Redis
redis-学习笔记(Jedis 通用命令)
redis-学习笔记(Jedis 通用命令)
30 1
|
30天前
|
Java Redis
redis-学习笔记(Jedis zset 简单命令)
redis-学习笔记(Jedis zset 简单命令)
29 3
|
30天前
|
NoSQL 网络协议 关系型数据库
redis-学习笔记(redis 单线程模型)
redis-学习笔记(redis 单线程模型)
30 3
|
30天前
|
Java Redis
redis-学习笔记(Jedis string 简单命令)
redis-学习笔记(Jedis string 简单命令)
27 2
|
30天前
|
Java Redis
redis-学习笔记(Jedis hash简单命令)
redis-学习笔记(Jedis hash简单命令)
26 1
|
30天前
|
存储 Java Redis
redis-学习笔记(Jedis set 简单命令)
redis-学习笔记(Jedis set 简单命令)
28 1
|
30天前
|
Java Redis
redis-学习笔记(Jedis list简单命令)
redis-学习笔记(Jedis list简单命令)
26 1
|
30天前
|
NoSQL Java Redis
redis-学习笔记(Jedis 前置知识)
redis-学习笔记(Jedis 前置知识)
24 1
|
30天前
|
NoSQL Java Redis
redis-学习笔记(string , hash , list , set , zset 前置知识)
redis-学习笔记(string , hash , list , set , zset 前置知识)
10 0
redis-学习笔记(string , hash , list , set , zset 前置知识)
|
18天前
|
存储 NoSQL Redis
Redis第七弹-Set与ZSET基本操作,Set(集合特点)SADD key member(注意这个key,必须是你自定义名字,不能用key)​编辑SMEMBERS key-查询所有的key
Redis第七弹-Set与ZSET基本操作,Set(集合特点)SADD key member(注意这个key,必须是你自定义名字,不能用key)​编辑SMEMBERS key-查询所有的key