【愚公系列】2022年05月 .NET架构班 050-分布式中间件 Redis存储原理之ZSet

举报
愚公搬代码 发表于 2022/05/02 17:14:17 2022/05/02
【摘要】 前言 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.元素数量小于 1282.所有 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。