【黑马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.rhkb.cn/news/468932.html

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

相关文章

WPF之iconfont(字体图标)使用

1,前文: WPF的Xaml是与前端的Html有着高度相似性的标记语言,所以Xaml也可同Html一般轻松使用阿里提供的海量字体图标,从而有效的减少开发工作度。 2,下载字体图标: 登录阿里图标库网iconfont-阿里巴巴矢量…

内网部署web项目,外网访问不了?只有局域网能访问!怎样解决?

相关技术 要实现“内网部署,外网访问”,可以使用内网穿透、VPN技术、DMZ主机、端口映射等方法。以下是对这些方法的详细解释: 一、内网穿透 内网穿透是一种技术,它通过将内网设备映射到公网上的方式,实现外网访问内…

Android MVVM demo(使用DataBinding,LiveData,Fresco,RecyclerView,Room,ViewModel 完成)

使用DataBinding,LiveData,Fresco,RecyclerView,Room,ViewModel 完成 玩Android 开放API-玩Android - wanandroid.com 接口使用的是下面的两个: https://www.wanandroid.com/banner/jsonhttps://www.wan…

c++11(一)

c11(一) 1. C11的发展历史2. 列表初始化2.1 C98传统的{}2.2 C11中的{}2.3 C11中的std::initializer_list 3. 右值引⽤和移动语义3.1 左值和右值3.2 左值引⽤和右值引⽤3.3 引⽤延⻓⽣命周期3.4 左值和右值的参数匹配3.5 右值引⽤和移动语义的使⽤场景3.5…

‍️代码的华尔兹:在 Makefile 的指尖上舞动自动化的诗篇

文章目录 😶‍🌫️😶‍🌫️😶‍🌫️背景——一个优秀工程师必备技能😶‍🌫️😶‍🌫️😶‍🌫️一、🤩🤩快速了解…

SpringBoot中使用Thymeleaf模板引擎

和使用freemarker差不多的方式 1、导入thymeleaf的启动器 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 2、编写Controller类 3、编写模板页面 注…

vue之子组件向父组件传值

参考博客先挂上 vue3中子传父&#xff08;emit&#xff09;、父传子&#xff08;props&#xff09;一篇文章拿下第一次写文章&#xff0c;告诉你vue3中如何实现父子相传&#xff0c;一篇文章帮 - 掘金 父组件通过 props 向子组件传值 1.子组件使用 $emit 触发事件 2.在父组件…

第26天 安全开发-PHP应用模板引用Smarty渲染MVC模型数据联动RCE安全

时间轴&#xff1a; 演示案例 新闻列表&模板引用-代码RCE安全 知识点 1、PHP 新闻显示-数据库操作读取显示 2、PHP 模版引用-自写模版&Smarty 渲染 3、PHP 模版安全-RCE 代码执行&三方漏洞 新闻列表 1.数据库创建新闻存储 2.代码连接数据库读取 3.页面进行自定…

【微服务】Docker 容器化

一、初识Docker 1. 为什么需要 Docker 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会遇到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性的问题开发、测试、生产环境有差异 Docker 如何解决依赖的兼容问题 将应用的Libs&#xff08;…

(十四)JavaWeb后端开发——MyBatis

目录 1.MyBatis概述 2.MyBatis简单入门 3.JDBC&#xff08;了解即可&#xff09; 4.数据库连接池​ 5.lombok 6.MyBatis基本操作 7.XML映射文件 8.动态SQL 8.1 if标签 8.2 foreach标签 8.3 sql/include标签​ 1.MyBatis概述 MyBatis是一款优秀的持久层&#xff08…

pytorch实现深度神经网络DNN与卷积神经网络CNN

DNN概述 深度神经网络DNN来自人脑神经元工作的原理&#xff0c;通过在计算机中逻辑抽象出多个节点&#xff0c;接收处理并向后传递信息&#xff0c;实现计算机的自我学习&#xff0c;类比结构见下图&#xff1a; 该方法通过预测输出与实际值的差异不断调整节点参数&#xff0…

私域流量圈层在新消费时代的机遇与挑战:兼论开源 AI 智能名片、2 + 1 链动模式、S2B2C 商城小程序的应用

摘要&#xff1a;本文剖析了私域流量圈层在新消费时代呈现出的独特温度与信任优势&#xff0c;阐述了从传统销售到新消费转型中用户心理的变化。同时&#xff0c;强调了内容对于私域流量的关键作用&#xff0c;并分析开源 AI 智能名片、2 1 链动模式、S2B2C 商城小程序在私域流…

1.4 配置 Android 构建系统

Android 构建系统会编译应用资源和源代码&#xff0c;然后将它们打包成 APK 或 Android App Bundle 文件&#xff0c;供您测试、部署、签名和分发。 创建自定义 build 配置需要您对一个或多个 build 配置文件做出更改。这些纯文本文件使用领域特定语言 (DSL) 通过 Kotlin 脚本&…

containerd配置私有仓库registry

机器ip端口regtisry192.168.0.725000k8s-*-------k8s集群 1、镜像上传 rootadmin:~# docker push 192.168.0.72:5000/nginx:1.26.1-alpine The push refers to repository [192.168.0.72:5000/nginx] 6961f0b8531c: Pushed 3112cd521249: Pushed d3f50ce9b5b5: Pushed 9efaf2eb…

ABAP:SET CURSOR FIELD设置鼠标焦点

SET CURSOR FIELD <字段名>&#xff1a;设置鼠标焦点到该字段 SET CURSOR 设置到鼠标焦点列还是行 SET CURSOR LINE 设置鼠标焦点到行 GET CURSOR field <字段名> &#xff1a;这个相对应的获取鼠标焦点得到的字段

PHP和Python脚本的性能监测方案

目录 1. 说明 2. PHP脚本性能监测方案 2.1 安装xdebug 2.2 配置xdebug.ini 2.3 命令行与VS Code中使用 - 命令行 - VS Code 2.4 QCacheGrind 浏览 3. Python脚本性能监测方案 3.1 命令行 4. 工具 5.参考 1. 说明 获取我们的脚本程序运行时的指标&#xff0c;对分析…

VS code 远程连接到docker容器

1.需要在vscode中下载remote 、docker、dev container插件。 如下图&#xff1a; 有小鲸鱼标志&#xff0c;说明已经成功。 右键可以运行或者停止容器运行

阿里1688 阿里滑块 231滑块 x5sec分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…

Spring Validation数据校检

文章目录 Spring Validation1 关于Spring Validation2 使用流程3 快速入门4 运行异常处理4.1 说明4.2 处理异常4.3 明确提示消息 5 常用注解5.1 NotNull注解5.2 NotEmpty 注解5.3 NotBlank 注解5.4 Size 注解5.5 Range 注解 6 非POJO参数校验6.1 使用流程6.2 使用示例 Spring V…

‌STAR法则

一&#xff1a;STAR法则 STAR法则是一种简单而实用的表现技巧&#xff0c;常被用于求职过程中的个人经历描述&#xff0c;富有条理性&#xff0c;可以帮助你在职场中脱颖而出。“STAR”分别对应的是situation-task-action-result&#xff0c;通过情境、目标、行动和结果四个方面…