【愚公系列】2022年05月 .NET架构班 050-分布式中间件 Redis存储原理之ZSet
【摘要】 前言 1.ZSet的概念排序的set,去重但是可以排序,写进去的时候给一个分数,自动根据分数排序,最大的特点是有个分数可以自定义排序规则。ZSet、List、Set比较:数据结构是否允许重复元素是否有序有序实现方式列表 list是是索引下标集合Set否否无有序集合zset否是分值score 2.skiplist的概念有序链表:在这样一个链表中,如果我们要查找某个数据,那么需要从头开始逐个进...
前言
1.ZSet的概念
排序的set,去重但是可以排序,写进去的时候给一个分数,自动根据分数排序,最大的特点是有个分数可以自定义排序规则。
ZSet、List、Set比较:
数据结构 | 是否允许重复元素 | 是否有序 | 有序实现方式 |
---|---|---|---|
列表 list | 是 | 是 | 索引下标 |
集合Set | 否 | 否 | 无 |
有序集合zset | 否 | 是 | 分值score |
2.skiplist的概念
有序链表:
在这样一个链表中,如果我们要查找某个数据,那么需要从头开始逐个进行比较, 直到找到包含数据的那个节点,或者找到第一个比给定数据大的节点为止。时间复杂度O(n)
skiplist跳表:
假如我们每相邻两个节点增加一个指针, 让指针指向下下个节点。
查找规则:
- 23 首先和 7 比较,再和 19 比较,比它们都大,继续向后比较。
- 但 23 和 26 比较的时候,比 26 要小,因此回到下面的链表(原链表),与 22 比较。
- 23 比 22 要大,沿下面的指针继续向后和 26 比较。23 比 26 小,说明待查数 据 23 在原链表中不存在。
一、Redis存储原理之ZSet
1.ZSet原理
ZSet内部数据类型使用有两种情况:
1、同时满足以下条件时使用 ziplist 编码:
1.元素数量小于 128 个
2.所有 member 的长度都小于 64 字节
在 ziplist 的内部,按照 score 排序递增来存储。插入的时候要移动之后的数据。
2、 超过阈值之后,使用 skiplist(跳表)+dict 存储。
2.ZSet编码类型
ZSet的编码有三种:
- int:存储 8 个字节的长整型(long,2^63-1)。大小超过了 long 的范围
(2^63-1=9223372036854775807)时会自动转成embstr。 - embstr:代表 embstr 格式的 SDS(Simple Dynamic String 简单动态字符串), 存储小于 44个字节的字符串。分配一次内存空间,而且是只读的。
- raw:存储大于 44 个字节的字符串(3.2 版本之前是 39 字节)。分配二次内存空间。
3.应用场景
场景 | 说明 |
---|---|
排行榜 | 去重、有序 |
4.相关操作命令
# 添加元素
zadd myzset 10 java 20 php 30 ruby 40 cpp 50 python
# 获取全部元素
# zrange 返回有序集中,指定区间内的成员。其中成员的位置按分数值递增(从小到大)来排序。
zrange myzset 0 -1 withscores
zrevrange myzset 0 -1 withscores
# 根据分值区间获取元素
zrangebyscore myzset 20 30
# 移除元素 也可以根据 score rank 删除
zrem myzset php cpp
# 统计元素个数
zcard myzset
# 分值递增
zincrby myzset 5 python
# 根据分值统计个数
zcount myzset 20 60
# 获取元素 rank
# Redis Zrank 返回有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列。
zrank myzset java
# 获取元素 score
zsocre myzset java
# 也有倒序的 rev 操作(reverse)
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)