redis数据结构汇总

news2025/1/20 5:48:59

在这里插入图片描述
redis每个【数据类型】所对应的【数据结构】

小结:

String
主要是SDSLong
1、基本编码方式是RAW,value = SDS
2EMBSTR编码  value = SDS  并且SDS长度小于44字节,只需要调用一次内存分配函数,效率更高
3INT编码:value = 整数值, 从⽽减少内存的使用。
如何追加字符串? 如何扩容? 如何缩容?


List
主要是LinkedListZipList(3.2以前)QuickList3.2以后)

3.2以前
ZipList编码: 当元素数量小于512, 并且元素大小小于64字节时
LinkedList: 默认都用这个

3.2以后
QuickList



Set
主要采用:dict+IntSet
IntSet:当存储数据都是【整数】,并且元素数量不超过【set-max-intset-entries】时,Set会采用IntSet编码,以节省内存
Dict:默认都用这个



Zset
主要采用:【SkipList+Dict】 或者 【ZipListZipList需要满足下面条件
1、元素【数量】小于zset_max_ziplist_entries,默认值128
2、每个元素【长度】都小于zset_max_ziplist_value字节,默认值64

ziplist如何排序?
ziplist本身没有排序功能,而且没有键值对的概念,因此需要有ZSet通过编码实现:ZipList是连续内存,
因此score和element是紧挨在一起的两个entry, element在前,score在后
score越小越接近队首,score越大越接近队尾,按照score值升序排列。



Hash
主要:【ziplist】 或者 【dict】
ziplist:数据项比较少,节省内存
条件:
1ZipList中的元素【数量】超过了hash-max-ziplist-entries( 默认为512)
2ZipList中的任意【Entry大小】超过了hash-max-ziplist-value (默认为64字节)

否则使用dict

关于几种数据结构的特点:

ZipList :压缩列表,可以从双端访问,内存占用低,存储上限低
LinkedList :普通链表,可以从双端访问,内存占用较高,内存碎片较多
QuickListLinkedList + ZipList,可以从双端访问,内存占用较低,包含多个ZipList,存储上限高

zipList和skipList的区别可以参考:跳转

什么是redisObject:

Redis中的任意【数据类型】的数据,所对应的value的值会被封装为一个【RedisObject】。

从Redis的使用者的角度来看,⼀个Redis节点包含多个database,而一个database维护了从key space到
object space的映射关系。这个映射关系的key是string类型,⽽value可以是多种数据类型,比如:string, 
list, hash、set、sorted set等。

我们可以看到,key的类型固定是string,而value可能的类型是多个。
⽽从Redis内部实现的⾓度来看,database内的所有【映射关系】都是用⼀个【dict】来维护的。

dict{
	sds key;//动态字符串sds
	redisObject value;
}


dict的key固定用⼀种数据结构来表达就够了,这就是【动态字符串sds】。
而value则比较复杂,为了在同⼀个dict内能够存储不同类型的value,这就需要⼀个通⽤的数据结构,
这个通用的数据结构就是robj,全名是【redisObject】
看下redisObject的结构

在这里插入图片描述

一、String

String的value一共有三种类型,RAW、Embstr、INT

在这里插入图片描述

关于String里面追加字符串是如何操作的,或者String里面扩容,以及缩容问题可以看这个: 跳转

二、List

在这里插入图片描述

三、set

SetRedis中的单列集合,满足下列特点:
1、不保证有序性
2、保证元素唯一
3、可以求2个set集合之间的:交集、并集、差集

SetRedis中的集合,不一定确保元素有序,可以满足元素唯一、查询效率要求极高。
为了查询效率和唯一性,set采用HT编码(Dict)。Dict中的key用来存储元素,value统一为null

可以看出,Set对查询元素的效率要求非常高,思考一下,什么样的数据结构可以满足?
HashTable,也就是Redis中的Dict,不过Dict是双列集合(可以存键、值对)
当存储的所有数据都是整数,并且元素数量不超过set-max-intset-entries时,Set会采用IntSet编码,以节省内存

在这里插入图片描述

四、ZSet

ZSet也就是SortedSet,其中每一个元素都需要指定一个score值和member值
1、可以根据score值排序后
2、member必须唯一
3、可以根据member查询分数

哪种编码结构可以满足?
SkipList:可以排序,并且可以同时存储score和ele值(member), 没办法实现高效的键唯一性检查
HTDict):可以键值存储,并且可以根据key找value, 不能排序

在这里插入图片描述

五、Hash

Hash结构与Redis中的Zset非常类似:
1、都是键值存储
2、都需求根据键获取值
3、键必须唯一

区别如下:
1、zset的键是member,值是score;hash的键和值都是任意值
2、zset要根据score排序;hash则无需排序


底层实现方式:压缩列表ziplist 或者 字典dict
当Hash中数据项比较少的情况下,Hash底层才⽤压缩列表ZipList进⾏存储数据以节省内存,ZipList中相邻的两个entry,分别保存field和value

随着数据的增加,底层的ziplist就可能会转成dict,触发条件有两个:
	ZipList中的元素数量超过了hash-max-ziplist-entries( 默认为512)
	ZipList中的任意Entry大小超过了hash-max-ziplist-value (默认为64字节)
当满足上面两个条件其中之⼀的时候,Redis就使⽤dict字典来实现hash



Redis的hash之所以这样设计,是因为当ziplist变得很⼤的时候,它有如下几个缺点:
1、每次插⼊或修改引发的realloc操作会有更⼤的概率造成内存拷贝,从而降低性能。
2、⼀旦发生内存拷贝,内存拷贝的成本也相应增加,因为要拷贝更⼤的⼀块数据。
3、当ziplist数据项过多的时候,在它上⾯查找指定的数据项就会性能变得很低,因为ziplist上的查找需要进行遍历。

在这里插入图片描述

文章地址:跳转

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1215308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超详细 | 萤火虫算法原理及其实现(Matlab)

群智能(Swarm Intelligence,SI)是一类分散自组织系统的集体智能行为的总称,该表述最早在1989年由Gerardo Beni在分子自动机系统中提出。SI系统可视作一组简单的个体,其个体与个体、个体与环境之间存在交互作用,最终表征出智能行为…

【第2章 Node.js基础】2.7 Node.js 的流

2.7 Node.js 的流 什么是流 流不是 Node.js 特有的概念。它们是几十年前在 Unix 操作系统中引入的。 我们可以把流看作这些数据的集合,就像液体一样,我们先把这些液体保存在一个容器里(流的内部缓冲区 BufferList),…

全平台自动去水印源码系统 一键下载高清无水印视频 支持全平台 带完整搭建部署教程

大家好啊,今天源码小编要来给大家分享一款超级好用的全平台自动去水印源码系统 。这款去水印的源码系统,支持全平台,可以帮你一键下载高清无水印视频。 以下是部分核心代码示例: 系统特色功能一览: 全平台支持&#…

免费分享!全国河流断面水质监测数据

随着人类活动的不断增加,河流的水质受到严重污染,为了保护河流生态环境,需要对河流断面水质进行监测。全国河流断面水质监测数据是反映全国河流污染状况的重要指标之一,通过对数据的分析,可以了解不同地区河流污染情况…

vue+element模仿实现PC端网易云,对接第三方接口

一、项目预览 在线预览:点击访问 其他项目访问:点击访问 项目使用传统vue项目结构实现,前端采用element实现。 element官网:Element - The worlds most popular Vue UI framework 二、 项目效果图 1.首页 2.歌单详情列表 3.歌…

国产高云FPGA开发软件Gowin的下载、安装、Licence共享,按照我的方案保证立马能用,不能用你铲我耳屎

目录 1、前言2、GOWIN简介3、GOWIN下载4、GOWIN安装5、Licence共享方案,立马就能用6、网盘福利领取 1、前言 “苟利国家生死以,岂因祸福避趋之!”大洋彼岸的我优秀地下档员,敏锐地洞察到祖国的短板在于高精尖半导体的制造领域&am…

el-table操作栏添加el-dropdown获取当前行的数据

0 效果 点击子合同获取到当前行的id 1 代码 beforeHandleCommand(row, childCommand) {return { row: row, childCommand: childCommand }; }, addChildBtn(command) {const row command.row;if (command.childCommand 0) {// todo} else {// todo} },

使用Rust编写爬虫代码来抓取精美的图片

目录 一、引言 二、Rust爬虫框架介绍 三、爬虫代码实现 1、创建Scrapy项目 2、创建Spider 3、定义Item对象 4、修改settings.py文件 5、运行爬虫程序 四、图片抓取与存储 五、优化爬虫性能 六、注意事项 总结 一、引言 网络爬虫是一种自动化的网页访问工具&#x…

Ghostbuster:一个准确度高的AI生成文本检测工具

大语言模型如ChatGPT,以其卓越的写作能力引发了问题。学生们纷纷利用这些模型代写作业,导致一些学校不得不采取禁止ChatGPT的措施。此外,这些模型还存在生成带有事实错误的文本的倾向,因此谨慎的读者可能想知道,在信任…

【汇编】Debug的使用

文章目录 前言一、Debug是什么?二、为什么Debug如此重要?三、Debug的使用3.1 Debug的运行3.1 R命令查看寄存器的状态改变寄存器的值 3.2 用D命令查看内存中的内容列出预设地址内存内容列出指定地方的内容列出指定地方的指定大小的内容 3.3 使用e命令修改…

OceanBase持续践行“一体化”产品战略,发布首个一体化数据库长期支持版本

11月16日,在OceanBase2023年度发布会上,OceanBase CEO杨冰宣布,OceanBase将持续践行“一体化”产品战略,为关键业务负载打造分布式数据库。 同时,会上发布一体化数据库的首个长期支持版本OceanBase 4.2.1 LTS&#xff…

12-1- GAN -简单网络-线性网络

功能 随机噪声→生成器→MINIST图像。 训练方法 1 判别器的训练,首先固定生成器参数不变,其次判别器应当将真实图像判别为1,生成图像判别为0 loss=loss(real_out, 1)+loss(fake_out, 0) 2 生成器的训练,首先固定判别器参数不变,其次判别器应当将生成图像判别为1 loss =…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之进程管理2》(4)

《Linux操作系统原理分析之进程管理2》》(4) 3 进程管理3.5 P、V操作3.5.1 信号量3.5.2 信号量的应用3.5.3 进程同步机制 3.6 进程通信3.6.1 消息通信3.6.2 信箱通信 3.7 死锁3.7.1 死锁的定义3.7.2 死锁产生的必要条件3.7.3 死锁的预防3.7.4 死锁的避免…

系列二十六、idea安装javap -c

一、概述 javap -c是一个能够将.java文件反编译为.class文件的指令,例如我在idea中编写了一个Car.java文件,我想看看这个类被编译后长什么样的,就可以使用该指令进行查看。 二、配置 2.1、 Java Bytecode Decompiler File>Settings>Pl…

基于ssm的高校共享单车管理系统(有报告)。Javaee项目,ssm项目。

演示视频: 基于ssm的高校共享单车管理系统(有报告)。Javaee项目,ssm项目。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 项目介绍&…

ssd202d-logo-cmd_bootlogo分析

cmd_bootlogo.c运行过程 common/autoboot.c:593: disp_logo(0); sprintf(cmd_str, "bootlogo %d 1 0 0 0", logo_id); do_display函数 获取对应结构体,里面有各种参数

【Dolphinscheduler3.1.1】二次开发本地启动项目(前端+后端)

背景说明 由于业务的定制化开发,需要对Dolphinscheduler进行二次开发,现将项目的启动步骤记录如下。 一、 基础软件安装(必装项请自行安装) Maven: v3.5,配阿里云仓库地址即可 Node: v16. MySQL (5.7系列) : 两者任选其一即可 JDK (1.8)…

深入解析Vue中的keep-alive组件:优化组件切换与DOM渲染!

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、K…

php连接sqlserver 安装sqlserver 驱动windows系统

第一步下载Windows 上的 Microsoft ODBC Driver for SQL Server ODBC 驱动程序 Microsoft ODBC Driver for SQL Server 直接下载安装即可,安装后可查看安装版本 第二步:下载php_sqlsrv 驱动 安装解压后,会有对应php版本的驱动文件&#xf…

单相浪涌保护器和三相浪涌保护器的区别

浪涌保护器,也称为防雷器,是一种为各种电子设备、仪器仪表、通讯线路提供安全防护的电子装置,主要用于限制过电压和泄放电涌电流。浪涌保护器的核心元件是内部的一个非线性元件。根据非线性元件的不同,浪涌保护器可以分为开关型&a…