Redis Zset的底层原理

news/2024/5/19 9:30:48

Redis Zset的底层原理

ZSet也就是SortedSet,其中每一个元素都需要指定一个score值和member值:

  • 可以根据score值排序后
  • member必须唯一
  • 可以根据member查询分数

在这里插入图片描述

因此,zset底层数据结构必须满足键值存储、键必须唯一、可排序这几个需求。之前学习的哪种编码结构可以满足?

  • SkipList:可以排序,并且可以同时存储score和ele值(member)
  • HT(Dict):可以键值存储,并且可以根据key找value

在这里插入图片描述
在这里插入图片描述
当元素数量不多时,HT和SkipList的优势不明显,而且更耗内存。因此zset还会采用ZipList结构来节省内存,不过需要同时满足两个条件:

  • 元素数量小于zset_max_ziplist_entries,默认值128(可以通过配置文件、命令修改默认值,如果元素数量==0,代表禁用ZipList)
  • 每个元素都小于zset_max_ziplist_value字节,默认值64

ziplist本身没有排序功能,而且没有键值对的概念,因此需要有zset通过编码实现:

  • ZipList是连续内存,因此score和element是紧挨在一起的两个entry, element在前,score在后
  • score越小越接近队首,score越大越接近队尾,按照score值升序排列
    ZipList图
    在这里插入图片描述

Zset底层原理白话

元素数量大于最大entries,或每个元素都大于value字节,就采用哈希表+跳表的结果,否则采用ZipList;
当采用的是ZipList,慢慢添加元素,会往跳表转化,在zsetadd方法中做判断,具体逻辑是这样的,判断编码是不是ZipList,是的话判断当前元素是否存在,如果存在更新score分数;如果元素不存在,需要判断ZipList的长度、元素大小有没有超,如果超了,转为跳表

在这里插入图片描述


http://www.mrgr.cn/p/58277378

相关文章

LSTM时间序列预测中的一个常见错误以及如何修正

当使用LSTM进行时间序列预测时,人们容易陷入一个常见的陷阱。为了解释这个问题,我们需要先回顾一下回归器和预测器是如何工作的。预测算法是这样处理时间序列的:一个回归问题是这样的:因为LSTM是一个回归量,我们需要把时间序列转换成一个回归问题。有许多方法可以做到这一点…

Plumed分子模拟后分析

Plumed是一个强大的分子模拟数据处理工具,可以在模拟的过程中逐步分析,也可以保存模拟的轨迹做后分析。本文紧接前面的“增强采样软件PLUMED的安装与使用”文章,还有“直方图与核密度估计”文章。介绍了如何使用Plumed后分析工具,对输出的反应坐标的轨迹进行核密度估计。技…

C++奇迹之旅:string类对象的容量操作

文章目录 📝 string类的常用接口🌉 string类对象的容量操作🌠size🌠length🌠capacity🌠clear🌠empty🌠reserve🌉resize 🚩总结 📝 string类的常用…

PWN入门之Stack Overflow

Stack Overflow是一种程序的运行时(runtime)错误,中文翻译过来叫做“栈溢出”。栈溢出原理是指程序向栈中的某个变量中写入的字节数超过了这个变量本身所申请的字节数,导致与其相邻的栈中的变量值被改变。 在本篇文章中&#xff…

动手学深度学习——卷积操作

卷积 卷积概念卷积原属于信号处理中的一种运算,引入CNN中,作为从输入中提取特征的基本操作 补零:在输入端外侧填补0值使得卷积输出结果满足某种大小,在外侧的每一边都添加0值,使得输出可以达到某种预定形状 跨步:卷积核在输入上滑动时每次移动到下一步的距离使用张量实现…

MyBatis-Plus 分页查询配置

说明一下 ,使用MyBatis-Plus 进行分页查询时 ,要先进行配置添加配置 /*** @Author North* @Date 2024/5/6*/ @Configuration public class MPConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor = new My…

编译官方原版的openwrt并加入第三方软件包

最近又重新编译了最新的官方原版openwrt-2305(2024.3.22),此处记录一下以待日后参考。 目录 1.源码下载 1.1 通过官网直接下载 1.2 映射github加速下载 1.2.1 使用github账号fork源码 1.2.2 创建gitee账号映射github openwrt 2.编译准…

QT5之事件——包含提升控件

事件概述 信号就是事件的一种,事件由用户触发; 鼠标点击窗口,也可以检测到事件;产生事件后,传给事件处理,判断事件类型,后执行事件相应函数; 类似单片机的中断(中断向量…

前端奇怪面试题总结

面试题总结 不修改下面的代码进行正常结构 这道题考的是迭代器和生成器的概念 let [a,b] {a:1,b:2}答案 对象缺少迭代器,需要手动加上 Object.prototype[Symbol.iterator] function* (){// return Object.values(this)[Symbol.iterator]()return yeild* Object.v…

Java从菜鸟到高手②

目录 1.输入输出 1.1输出 1.2.输入 1.3.scan.nextLine()和scan.next()的区别 2.方法的使用 2.1.方法的定义 2.2.形参和实参的关系 2.3.方法的重载 2.4.方法签名 3.递归 3.1.递归有递和归两个部分组成 4.数组 4.1.数组的定义 4.2.将数组转化为字符串 4.3深入理解…

VS打包项目成.exe.msi

VS打包项目成.exe&.msi ref:https://blog.csdn.net/weixin_44790046/article/details/103016154准备工作VS 2022(VS2017无法安装Installer Projects扩展,未知原因) Installer Projects (扩展 > 管理扩展 > 联机 > 搜索 > Microsoft Visual Studio Installe…

Spring学习之——Bean加载流程

Spring IOC容器就像是一个生产产品的流水线上的机器,Spring创建出来的Bean就好像是流水线的终点生产出来的一个个精美绝伦的产品。既然是机器,总要先启动,Spring也不例外。因此Bean的加载流程总体上来说可以分为两个阶段:容器启动阶段 Bean创建阶段一、容器启动阶段: 容器…

探索快速排序算法:理解、优化与应用

在计算机科学领域,排序算法是一项基础而重要的技术,它在各种应用场景中发挥着至关重要的作用。其中,快速排序算法因其高效性和广泛应用而备受关注。本文将深入探讨快速排序算法的原理、优化技巧以及实际应用,带你深入理解这一经典…

AI实战 | 手把手带你打造智能待办助手

最初通过百度Create大会的启发,在设计过程中,我考虑了用户的日常需求,包括天气查询、时间管理建议、健康提醒等,确保助手能够为用户提供全方位的服务。背景 大家好,我是努力的小雨。今天我想分享一下搭建待办助手的经历。起初,我并没有什么特别的创意点子。但在4月16日的…

阿里实习生:面试阿里其实并没有那么难。

Go语言中的数据结构并发安全特性、单例模式实现及sync.map底层原理解析。分享一位同学在阿里的Go后端实习面经详解, 希望对你有帮助。愉快的五一假期已经结束了, 又要投入到学习和工作当中了。 今天分享一位同学在阿里的Go后端实习面经详解, 希望对你有帮助。Go里有哪些数据结构…

Mac 安装 RabbitMQ

一般来说,安装分为两种方式:通过 brew 命令安装。在这里,推荐使用 brew 来安装,非常强大的 Mac 端包管理工具。 下载 RabbitMQ 源文件,解压源文件之后进行安装。 Docker启动一、brew 命令安装Mac安装 RabbitMQ 1、安装 erlang brew install erlang2、安装 rabbitmq brew i…

Deepin-Docker-Memcached

目标:基于deepin+docker安装 memchaed 1.镜像下载 docker pull memcached:latest 2.容器启动 docker run -d -p 11211:11211 --name memcached-test memcached:latest 3.启动检查4.启动Ok

多区域协作时 如何实现便捷可控的文件跨域传输?

文件跨域传输的场景在现代企业运营中非常普遍,特别是在那些具有分布式结构或需要跨地域合作的组织中。 以下是一些典型的多区域文件传输场景: 1、企业内部跨地域传输:大型企业或跨国公司在不同地区设有分支机构,需要在这些分支机构之间传输业务数据和公司文件。 2、供应链…

CNN实现卫星图像分类(tensorflow)

使用的数据集卫星图像有两类,airplane和lake,每个类别样本量各700张,大小为256*256,RGB三通道彩色卫星影像。搭建深度卷积神经网络,实现卫星影像二分类。 数据链接百度网盘地址,提取码: cq47 1、查看tenso…

Android 14 变更及适配攻略

准备工作 首先将我们项目中的 targetSdkVersion和compileSdkVersion 升至 34。 影响Android 14上所有应用 1.最低可安装的目标 API 级别 从 Android 14 开始,targetSdkVersion 低于 23 的应用无法安装。要求应用满足这些最低目标 API 级别要求有助于提高用户的安…