Redis——五种数据类型

目录

前言

1.String

1.1RAW编码

1.2EMBSTR编码

1.3 INT编码

 2.List

3.Set

3.1 InSet编码转化成Dict编码

4.ZSet

4.1结合SkipList和HT实现

 4.2使用ZipList实现

4.3编码转换 

4.4 ZipList排序功能

5.Hash

5.1Hash底层存储结构

6.Redis数据结构和数据类型关系图 


前言

 Redis 中的每种数据类型都由特定的数据结构来实现,数据结构为数据类型提供了底层的存储和操作机制。

不同的数据类型具有不同的特性和应用场景,数据结构的选择和设计是为了更好地满足这些特性

数据结构是实现数据类型的基础,它们共同构成了 Redis 强大的功能体系,使得 Redis 能够在不同的应用场景中,根据数据的特点和操作需求,选择合适的数据类型和对应的数据结构来高效地处理和管理数据。

1.String

String是Redis中最常见的数据存储类型:

其基本编码方式是RAW,基于简单动态字符串(SDS)实现,存储上限为512mb。

查看编码:object encoding key

1.1RAW编码

ptr指针指向SDS,RedisObject和SDS是两个独立空间所以会有寻址过程通过ptr指针找到SDS。所以会有两次申请内存空间,释放内存也会有两次内存释放,效率比较低。

1.2EMBSTR编码

如果存储的SDS长度小于44字节,EMBSTR编码,此时object head与SDS是一段连续空间。申请内存时只需要调用一次内存分配函数,效率更高。

好处:减少内存碎片

Redis 通常按页分配内存,使用 jemalloc 等内存分配器,它会分配 8、16、32、64 等字节的内存块。对于小于 44 字节的字符串,采用 embstr 编码可以将其存储在一个连续的 64 字节内存块中,减少了内存碎片的产生

如果字符串较长,超过 44 字节,为其单独分配内存空间(转为 raw 编码),采用常规的 robj 和SDS分离方案性能下降,产生内存碎片

1.3 INT编码

如果存储的字符审是整数值,并且大小在LONG_MAX范围内,INT编码,直接将数据保存在RedisObject的ptr指针位置(刚好8字节),不再需要SDS了。


 2.List

Redis的List结构类似双端链表,可以从首尾操作列表中的元素

选择何种数据结构呢?

  1. LinkList:普通链表,可以从双端访问,链表每个节点都是独立的内存,节点与节点之间的访问通过指针,指针比较占用内存,内存碎片较多。
  2. ZipList:压缩列表,可以从双端访问,内存占用较低,存储上限低。如果一次性存储大量内存需要申请大量内存空间比较困难。
  3. QuickList:LinkedList+ZipList,可以双端访问,内存占用较低,包含多个ZipList,存储上限高。

在3.2版本之前,Redis采用ZipList来实现List,当元素数量小于512并且元素大小小于64字节时采用ZipList编码,超过则采用LinkedList编码。


在3.2版本之后,redis统一采用QuickList来实现List。Redis 可以通过list-max-ziplist-size参数来控制每个 ZipList 节点的大小,通过list-compress-depth参数来控制 QuickList 的压缩深度,即链表两端不压缩的节点数量,以此来平衡内存使用和操作性能。

插入元素底层源码

整体内存结构


3.Set

Set是Redis中的单列集合,满足下列特点:

  • 不保证有序性
  • 保证元素唯一(可以判断元素是否存在)
  • 求交集,并集,差集

不管是插入元素还是求交集等等这些操作都需要判断元素是否存在,这样就需要选择对元素查询效率较高的数据结构

  • 为了查询效率和唯一性,set采用HT编码(Dict)Dict中的key用来存储元素,value统一为null
  • 当存储的所有数据都是整数,并且元素数量不超过set-max-intset-entset会采用IntSet编码,以节省内存。

判断用哪种数据结构底层源码

创建IntSet数据结构底层源码

创建Dict数据结构底层源码

整体执行源码

3.1 InSet编码转化成Dict编码

当元素数量超过set-max-intset-entries或者存储元素不是数字了时会自动转换成Dict编码

执行结构图:

当插入一个元素为m1字符串时会升级为Dict编码,创建Dict数据结构

RedisObject指针ptr指向Dict,encoding编码改为Dict


4.ZSet

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

可以根据score值排序

member必须唯一

可以根据member查询分数

因此,ZSet底层数据结构必须满足键值存储键必须唯一可排序这几个需求。

4.1结合SkipList和HT实现

  • SkipList:可以排序,并且可以同时存储score和ele值(member) | 满足键值存储和可排序
  • HT(Dict):可以键值存储,并且可以根据key找value | 满足高效查询键值唯一

所以ZSet底层是使用这两种数据结构来实现的dict用于快速查找SkipList用于键值存储和排序

底层源码:

内存图:

 4.2使用ZipList实现

使用上述那种方式这样带来的坏处就是ZSet非常占用内存空间,使用两种数据结构,存储两份。

当元素数量不多时,HT和SkipList的优势不明显,而且更耗内存。因此Zset还会采用ZipList不过需要同时满足两个条件:

  • 元素数量小于zset_max_ziplist_entries,默认值128
  • 每个元素都小于zset_max_ziplist_value字节,默认值64

底层判断使用哪种数据结构如下:

4.3编码转换 

既然ZSet底层都是用来两种编码方式根据不同情况,那么肯定会出现编码转换,添加元素不满足一下两个条件就会触发编码转换。

  • 元素数量小于zset_max_ziplist_entries,默认值128
  • 每个元素都小于zset_max_ziplist_value字节,默认值64

底层执行源码:

4.4 ZipList排序功能

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

  • ZipList是连续内存,因此score和element是紧换在一起的两个entry,element在前,score在后
  • score越小越接近队首,score越大越接近队尾,按照score值升序排列

底层结构图:

因为元素比较少ZipList内存中是连续存储的,所以查找的时候就去遍历,插入元素的时候按照大小顺序插入,这样就保证了排序。性能也不错。


5.Hash

Hash结构与Redis中的Zset非常类似:

  • 都是键值存储
  • 都需要根据键获取值
  • 键必须唯一

区别如下:

  • zset的键是member,值是score;hash的键和值都是任意值
  • zset要根据score排序;hash则无需排序

5.1Hash底层存储结构

  • Hash结构默认采用ZipList编码,用以节省内存。ZipList中相邻的两个entry分别保存field和value
  • 当数据量较大时,hash结HT编码,也就是Dict,触发条件有两个:

                ziplist中的元素数量超过了hash-max-ziplist-entries(默认512)
                ziplist中的任意entry大小超过了hash-max-ziplist-value(默认64字节)

转换流程:

触发条件达成转换编码

6.Redis数据结构和数据类型关系图 

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

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

相关文章

zookeeper启动报错have small server identifier

解决方案: 1、查看myid是否有重复 2、查看server.X 与myid的X是否一致 3、启动顺序为myid从小到大的服务器顺序

#Linux动态大小裁剪以及包大小变大排查思路

1 动态库裁剪 库分为动态库和静态库,动态库是在程序运行时才加载,静态库是在编译时就加载到程序中。动态库的大小通常比静态库小,因为动态库只包含了程序需要的函数和数据,而静态库则包含了所有的函数和数据。静态库可以理解为引入…

消息队列生产者投递的高可靠性与一致性保障方案

在构建高可靠分布式系统时,确保业务数据库与消息队列(MQ)之间的一致性是一项核心挑战。尤其当使用 Kafka 作为消息队列中间件时,如何避免“数据库写入成功,但消息发送失败”或“消息重复发送”等问题,成为系…

Formality:Bug记录

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 本文记录博主在使用Synopsys的形式验证工具Formality中遇到的一个Bug。 Bug复现 情况一 // 例1 module dff (input clk, input d_in, output d_out …

通信算法之267 : DJI无人机 云哨 DroneID 640ms

DJI 无人机 与DroneID 转 *** 载 0x01 摘要 消费级无人机可以用于高级航拍、物流和人道主义救援等等。但是其广泛使用给安全、安保和隐私带来了许多风险。例如,攻击方可能会使用无人机进行监视、运输非法物品,或通过侵入机场上方的封闭空域造成经济损…

论坛测试报告

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

npx 的作用以及延伸知识(.bin目录,npm run xx 执行)

文章目录 前言原理解析1. npx 的作用2. 为什么会有 node_modules/.bin/lerna3. npx 的查找顺序4. 执行流程总结1: 1. .bin 机制什么是 node_modules/.bin?例子 2. npx 的底层实现npx 是如何工作的?为什么推荐用 npx?npx 的特殊能力…

【c语言】深入理解指针3——回调函数

一、回调函数 回调函数:通过函数指针调用的函数. 当把一个函数的地址传递给另一个函数,通过该地址去调用其指向的函数,那么这个被调用的函数就是回调函数. 示例: 在【深入理解指针2】中结尾写了用函数指针实现计算器的功能&#…

HTTP 核心概念

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

VidBot:从野外 2D 人体视频中学习可泛化的 3D 动作,实现零样本机器人操控

25年3月来自慕尼黑工大、瑞士 ETH 和微软的论文“VidBot: Learning Generalizable 3D Actions from In-the-Wild 2D Human Videos for Zero-Shot Robotic Manipulation”。 未来的机器人被设想为能够执行各种家务的多功能系统。最大的问题仍然是,如何在尽量减少机器…

Linux 日常运维命令大全

Linux 作为一种开源操作系统,在服务器运维中扮演着重要角色。掌握常用的 Linux 命令对于运维人员而言至关重要。本文将整理一份 Linux 服务器运维常用命令大全,帮助你在日常工作中提高效率和准确性。 1. 基础命令 基础命令是Linux操作的起点&#xff0…

编程规范之枚举

编程规范之枚举 1.1 初始化枚举项 枚举平时用的也没有很频繁,今天看代码规范提到枚举类型初始化枚举项。并对初始化枚举项进行了归纳。包括下面三个 不进行显示初始化,交由编译器完成。 对第一个枚举项的显式初始化,这样可以强制整数值的…

《软件设计师》复习笔记(12.1)——范围管理、进度管理

目录 一、范围管理 1. 核心概念 2. 范围管理过程 WBS(工作分解结构)示例 真题示例: 二、进度管理 1. 核心过程 2. 关键工具与技术 真题示例: 一、范围管理 1. 核心概念 项目范围:为交付产品必须完成的工作…

过去十年前端框架演变与技术驱动因素剖析

一、技术演进脉络(2013-2023) 2013-2015:结构化需求催生框架雏形 早期的jQuery虽然解决了跨浏览器兼容性问题(如IE8兼容性处理),但其松散的代码组织方式难以支撑复杂应用开发。Backbone.js的出现首次引入M…

中华传承-医山命相卜-梅花易数

梅花易数 灵活起卦(如数字、声音、外应等)和象数结合,准确率可达96.8%。其起卦方式摆脱传统龟壳、蓍草的繁琐,强调直觉与灵活性。 个人决策、事件预测等 尤其在短期、具体问题上表现突出。

如何用Brower Use WebUI实现网页数据智能抓取与分析?

作者:算力魔方创始人/英特尔创新大使刘力 Browser-use是一款能让AI智能体像人类一样操作网页的创新工具,与传统网络爬虫技术相比,Browser-use能模拟人浏览并操作网页,在采集网站数据时,不会被网站反爬机制识别和封禁&…

LIMS引领综合质检中心数字化变革,赋能质量强国战略

在质量强国战略的深入推进下,我国综合质检机构迎来了前所未有的发展机遇,同时也面临着诸多严峻挑战。随着检测领域从传统的食品药品监督向环境监测、新材料检测等新兴领域不断拓展,跨领域协同管理的复杂度呈指数级增长。作为提升产品质量的关…

简单好用的在线工具

用AI写了一些在线工具,简介好用,推荐给大家,欢迎大家使用并提议意见。 网址:https://www.bittygarden.com/ 目前已有以下功能: MD5SM3SHAUnicode 编码Unicode 解码Base32 编码Base32 解码Base64 编码Base64 解码URL …

阿里云服务器搭建开源版禅道

一,下载地址:禅道11.5版本发布,主要完善细节,修复bug,新增动态过滤机制 - 禅道下载 - 禅道项目管理软件 下载地址二: 禅道21.6.stable 实现旧编辑器撰写的文档无感升级至新版编辑器 - 禅道下载 - 禅道项目…

leetcode 309. Best Time to Buy and Sell Stock with Cooldown

目录 题目描述 第一步,明确并理解dp数组及下标的含义 第二步,分析并理解递推公式 1.求dp[i][0] 2.求dp[i][1] 3.求dp[i][2] 第三步,理解dp数组如何初始化 第四步,理解遍历顺序 代码 题目描述 这道题与第122题的区别就是卖…