【黑马Redis原理篇】Redis数据结构

视频来源:原理篇[2,15]

文章目录

  • 1.动态字符串SDS
    • 1.1 内部结构:
  • 2.IntSet
  • 3.Dict
    • 3.1 dict的内部结构
    • 3.2 dict的扩容
  • 4.ziplist压缩列表
  • 5.QuickList
  • 6.SkipList跳表
  • 7.RedisObject对象
  • 8.Redis的五种数据结构
    • 8.1 String
    • 8.2 List
    • 8.3 Set
    • 8.4 Zset 有序集合
    • 8.5 Hash

底层实现

1.动态字符串SDS

Redis的key是字符串,value总是字符串或者字符串的集合。

redis没有直接使用c语言字符串。c语言字符串的缺点:获取字符串长度需要运算;非二进制安全;不可修改。

Redis自己构建的字符串,叫做简单动态字符串SDS。优点是可以直接获取长度,可以动态扩容。

1.1 内部结构:

在这里插入图片描述
动态扩容示例:
在这里插入图片描述

2.IntSet

是set集合的一种实现方式。基于整数数组来实现,特点:长度可变、有序等。
结构:
在这里插入图片描述

扩容过程:
在这里插入图片描述

3.Dict

3.1 dict的内部结构

Dict由三部分组成:哈希表(dict hash table)、哈希节点(dict entry)、字典(dict)。
在这里插入图片描述
在这里插入图片描述

3.2 dict的扩容

在这里插入图片描述
除了扩容,也会收缩
在这里插入图片描述

4.ziplist压缩列表

可以看成一种特殊的双端列表(它没有指针)。由特殊编码的连续内存块组成。可以在任意一端进行压入、弹出操作,并且复杂度为O(1)。
各种编码的最终目的就是节省内存。
依然是逐个遍历的。
在这里插入图片描述
entry中记录前一个节点的长度,这样可以支持倒序遍历。
在这里插入图片描述
ziplist可能引发 连锁更新 问题,原因:前一个节点的长度决定了这一个节点的previous_entry_length。新增/删除可能导致连锁更新的产生。
在这里插入图片描述

5.QuickList

ziplist申请连续内存空间时,如果内存占用较大,申请不到连续的,但我们要存的数据超过了ziplist的上限,怎么办?我们可以分片思想,用多个ziplist分别申请空间。那么分散的数据如何建立联系?
QuickList本质是双端链表,但每个节点都是一个ziplist。
在这里插入图片描述
通过配置,quicklist可以对ziplist的大小进行限制,还可以对节点ziplist进行压缩。
在这里插入图片描述

6.SkipList跳表

ziplist和quicklist都是为了节省内存,但是是链表是逐个遍历的。
skiplist特点:依然是链表
(1)元素升序排列;
(2)节点可能包含多个指针,指针跨度不同;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.RedisObject对象

在这里插入图片描述
数据类型:string, list, set, zset, hash
在这里插入图片描述

8.Redis的五种数据结构

8.1 String

(1)RAW编码
需要申请、释放两次内存空间。RedisObject和SDS。
在这里插入图片描述
(2)EMBSTR编码
总共不超过64字节
在这里插入图片描述
(3)INT编码
在这里插入图片描述
在这里插入图片描述

8.2 List

List类型可以从首、尾操作列表中的元素。
在这里插入图片描述
在这里插入图片描述
使用quicklist实现list。
在这里插入图片描述

8.3 Set

无序、唯一
在这里插入图片描述
Redis中dict是哈希表。set采用HT编码(dict),dict中的key用来存储元素,value统一为null。
在这里插入图片描述

如果是存储整数,并且数量没超,就使用IntSet编码。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

8.4 Zset 有序集合

score值越小,排名越靠前;member唯一。
在这里插入图片描述
在这里插入图片描述
方法一:使用dict+skiplist。两份数据冗余,可以实现功能,但是内存占用太高。
在这里插入图片描述
方法二:ziplist,数量有限时,节省内存。
但是它本身没有排序、没有键值对,需要业务逻辑来做。
排好序插入;元素element后面接着score
在这里插入图片描述

在这里插入图片描述
两种方式的转换:
在这里插入图片描述

8.5 Hash

默认采用ziplist方法。
在这里插入图片描述
超过大小,转为dict。(与zset相比,不用排序,所以不需要加跳表)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

SpringBoot 创建多模块项目 项目分模块 项目简化 打包发布

介绍 在 Spring Boot 中,创建多模块项目可以帮助我们将项目拆分成多个相对独立、可重用的模块,从而使代码结构更清晰,便于管理和维护。通常,这样的做法可以提高开发效率,并且更易于进行版本控制和分布式部署。 项目结…

MySQL 数据库之表操作

1. 创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) [character set 字符集 collate 校验规则 engine 存储引擎];field 表示列名datatype 表示列的类型character set 字符集,如果没有指定字符集,则以所在数据库…

【R78/G15 开发板测评】串口打印 DHT11 温湿度传感器、DS18B20 温度传感器数据,LabVIEW 上位机绘制演化曲线

【R78/G15 开发板测评】串口打印 DHT11 温湿度传感器、DS18B20 温度传感器数据,LabVIEW 上位机绘制演化曲线 主要介绍了 R78/G15 开发板基于 Arduino IDE 环境串口打印温湿度传感器 DHT11 和温度传感器 DS18B20 传感器的数据,并通过LabVIEW上位机绘制演…

Chromium Mojo(IPC)进程通信演示 c++(2)

122版本自带的mojom通信例子associated-interface 仅供学习参考: codelabs\mojo_examples\02-associated-interface-freezing 一、目录结构如图: 二、interface.mojom接口 1、codelabs\mojo_examples\mojom\interface.mojom // Copyright 2023 The C…

「Mac畅玩鸿蒙与硬件32」UI互动应用篇9 - 番茄钟倒计时应用

本篇将带你实现一个番茄钟倒计时应用,用户可以设置专注时间和休息时间的时长,点击“开始专注”或“开始休息”按钮启动计时,应用会在倒计时结束时进行提醒。番茄钟应用对于管理时间、提升工作效率非常有帮助,并且还会加入猫咪图片…

u盘怎么重装电脑系统_u盘重装电脑系统步骤和详细教程【新手宝典】

u盘怎么重装电脑系统?一个u盘怎么重装电脑系统呢,需要将u盘制作成u盘启动盘pe,然后通过U盘启动盘进入pe进行安装系统,下面小编就教大家u盘重装电脑系统步骤和详细教程。 u盘启动是什么意思? U盘启动盘是一种具有特殊功…

Typora导出pdf手动分页和设置字体样式

手动分页 <div style"page-break-after: always;"></div>鼠标点击代码才会显示&#xff0c;不点击会隐藏。导出pdf时&#xff0c;该位置会分页 设置字体大小、加粗、居中、空格 <p style"font-size:30px; font-weight: bold; text-align: cen…

简简单单的UDP

前言 上一篇了解了TCP的三次握手过程&#xff0c;目的、以及如何保证可靠性、序列号与ACK的作用&#xff0c;最后离开的时候四次挥手的内容&#xff0c;这还只是TCP内容中的冰山一角&#xff0c;是不是觉得TCP这个协议非常复杂&#xff0c;这一篇我们来了解下传输层另外一个协…

淘宝/天猫按图搜索商品:taobao.item_search_img API的奇幻之旅

在这个看脸的时代&#xff0c;我们不仅对人要看颜值&#xff0c;连买东西都要“看脸”了。没错&#xff0c;我说的就是淘宝/天猫的按图搜索商品功能——taobao.item_search_img API。这个功能就像是电商平台的“人脸识别”&#xff0c;只不过它认的是商品的颜值。下面&#xff…

软件工程 软考

开发大型软件系统适用螺旋模型或者RUP模型 螺旋模型强调了风险分析&#xff0c;特别适用于庞大而复杂的、高风险的管理信息系统的开发。喷泉模型是一种以用户需求为动力&#xff0c;以对象为为驱动的模型&#xff0c;主要用于描述面向对象的软件开发过程。该模型的各个阶段没有…

STM32F405RGT6单片机原理图、PCB免费分享

大学时机创比赛时画的板子&#xff0c;比到一半因为疫情回家&#xff0c;无后续&#xff0c;&#xff0c;&#xff0c;已打板验证过&#xff0c;使用stm32f405rgt6做主控 下载文件资源如下 原理图文件 pcb文件 外壳模型文件 stm32f405例程 功能 以下功能全部验证通过 4路…

写一个记录函数执行时间的装饰器

装饰器&#xff0c;这可是Python开发中绕不开的经典话题&#xff0c;不论你是写代码的老手&#xff0c;还是刚入行的萌新&#xff0c;都得和它打上几轮交道。而记录函数执行时间这个功能&#xff0c;更是装饰器中的“常客”。 今天我就带大家来全面解锁一下这块儿的知识&#…

Python 桌面应用开发:使用 Tkinter 创建 GUI 应用程序

Python 桌面应用开发&#xff1a;使用 Tkinter 创建 GUI 应用程序 引言 随着计算机技术的飞速发展&#xff0c;桌面应用程序依然在许多领域中发挥着重要作用。Python 作为一种强大的编程语言&#xff0c;提供了多种工具和库来创建桌面应用程序。其中&#xff0c;Tkinter 是 P…

vue3入门知识(一)

vue3简介 性能的提升 打包大小减少41%初次渲染快55%&#xff0c;更新渲染快133%内存减少54% 源码的升级 使用Proxy代替defineProperty实现响应式重写虚拟DOM的实现和Tree-Shaking 新的特性 1. Composition API&#xff08;组合API&#xff09; setupref与reactivecomput…

AI与就业:技术革命下的职业转型与挑战

内容概要 在当今时代&#xff0c;人工智能的迅猛发展正在深刻影响着我们的就业市场。这一技术革命不仅让我们看到了未来的职业转型&#xff0c;还引发了对于新兴技能需求的深思。随着AI技术的普及&#xff0c;许多传统行业面临着巨大的变革压力&#xff0c;同时也为新兴领域创…

小白初入Android_studio所遇到的坑以及怎么解决

1. 安装Android_studio 参考&#xff1a;Android Studio 安装配置教程 - Windows(详细版)-CSDN博客 Android Studio超级详细讲解下载、安装配置教程&#xff08;建议收藏&#xff09;_androidstudio-CSDN博客 想下旧版本的android_studio的地址&#xff08;仅供参考&#xf…

Uubntu下的Boost库安装及使用

一、Boost库介绍 Boost库是为C语言标准库提供扩展的一些C程序库的总称。 Boost库由Boost社区组织开发、维护。其目的是为C程序员提供免费、同行审查的、可移植的程序库。Boost库可以与C标准库共同工作&#xff0c;并且为其提供扩展功能。Boost库使用Boost License来授权使用&…

【王木头】最大似然估计、最大后验估计

目录 一、最大似然估计&#xff08;MLE&#xff09; 二、最大后验估计&#xff08;MAP&#xff09; 三、MLE 和 MAP 的本质区别 四、当先验是均匀分布时&#xff0c;MLE 和 MAP 等价 五、总结 本文理论参考王木头的视频&#xff1a; 贝叶斯解释“L1和L2正则化”&#xff…

「QT」几何数据类 之 QPointF 浮点型点类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

数据结构与算法——Java实现 54.力扣1008题——前序遍历构造二叉搜索树

不要谩骂以前的自己 他当时一个人站在雾里也很迷茫 ​​​​​​​ ​​​​​​​ ​​​​​​​—— 24.11.6 1008. 前序遍历构造二叉搜索树 给定一个整数数组&#xff0c;它表示BST(即 二叉搜索树 )的 先序遍历 &#xff0c;构造树并返回其根。 保证 对于给定…