Redis 五大数据类型底层原理

news2024/11/24 23:03:50

0、前言

本文涉及的主题:

  1. redis 对象存储

  2. 底层数据结构:int、embstr、raw、ziplist、listpack、quicklist、skiplist、intset、hashtable

  3. redis 数据类型:string、list、set、zset、hash

1、对象存储、底层编码、数据类型

1.1 对象存储

每个键值对对应一个 dictEntry
在这里插入图片描述

1.2 数据类型 X 底层编码 = 映射关系

编码常量 : github

在这里插入图片描述

映射关系演示 1:

在这里插入图片描述

映射关系演示 2:

在这里插入图片描述

2、string

2.1 int、embstr、raw

int:长度小于19的整数

embstr:长度小于44的字符串

raw:长度大于44的字符串

对 int 、embstr对象进行修改,例如append操作,修改后的对象会变为 raw

类似于Java里面 byte short 执行相加操作后,会变为 int

在这里插入图片描述

2.2 sds 简单动态字符串

在这里插入图片描述

C语言SDS
字符串长度处理从头开始遍历,直到遇到 ‘\0’ 为止,时间复杂度O(N)记录当前字符串的长度,时间复杂度 O(1)
内存重新分配分配内存空间超过后,会导致数组下标越级或者内存分配溢出空间预分配 && 惰性空间释放
二进制安全字符串包含特殊字符,比如 ‘\0’ ,C中字符串遇到 ‘\0’ 会结束,那’\0’ 之后的数据就读取不到根据 len 长度来判断字符串结束的

3、hash

3.1 ziplist

ziplist 可以存储字符串或整数,以紧凑的数据结构存储在连续的内存块中,元素之间没有指针,内存使用率非常高

优点:

  • 遍历比指针快。ziplist 中 entry的遍历是通过计算 当前起始位置+当前entry长度
  • 可以直接通过 zllen 获取列表长度

缺点:

  • 连锁更新。修改 entry 时,可能会导致后面的 entry 都需要重新分配内存,以及更新 prevlen

在这里插入图片描述

3.2 listpack

优点:

(解决了连锁更新问题,兼具ziplist的优点)

listpack不仅解决了ziplist中存在的连锁更新问题,还通过特有的编码方式和结构设计,实现了高效的正反方向遍历

在这里插入图片描述

4、list

4.1 quicklist

quicklist 是一个双向链表,每个节点都是一个 ziplist(redis 6 )/ listpack(redis 7),head 和 tail 指向头尾

在这里插入图片描述

5、set

5.1 intset

节点个数 <= 常量值, 编码为 intset

5.2 hashtable

节点个数 > 常量值 , 编码为 hashtable

6、zset

默认 ziplist / listpack , 当节点个数 或 节点的value长度 超出设置的常量值,会升级为 skiplist

6.1 skiplist

是什么:

  • 实现二分查找的有序链表 = 链表 + 多级索引

解决的问题:

  • 大数据量情况下 ,顺序存储的 单链表查询 效率低

缺点:

  • 修改数据效率比较低

在这里插入图片描述

7、总结

在这里插入图片描述

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

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

相关文章

SpringBoot实现多数据源切换快速入门

1. 概述 随着项目规模的扩大和业务需求的复杂化&#xff0c;单一数据源已经不能满足实际开发中的需求。在许多情况下&#xff0c;我们需要同时操作多个数据库&#xff0c;或者需要将不同类型的数据存储在不同的数据库中。这时&#xff0c;多数据源场景成为必不可少的解决方案。…

C#的多线程UI窗体控件显示方案 - 开源研究系列文章

上次编写了《LUAgent服务器端工具》这个应用&#xff0c;然后里面需要新启动一个线程去对文件进行上传到FTP服务器&#xff0c;但是新线程里无法对应用主线程UI的内容进行更改&#xff0c;所以就需要在线程里设置主UI线程里控件信息的方法&#xff0c;于是就有了此博文。此文记…

录屏怎么打开?这3招请收好

在数字化飞速发展的今天&#xff0c;录屏功能已经不仅仅是一个简单的工具&#xff0c;而是成为了我们工作、学习和娱乐中的得力助手。但是&#xff0c;不同设备或系统打开录屏功能的方式可能有所不同&#xff0c;打开录屏功能的方式也在不断更新和演变&#xff0c;今天我们就来…

【前端项目笔记】8 订单管理

订单管理 效果展示&#xff1a; 在开发功能之前先创建分支order cls 清屏 git branch 查看所有分支&#xff08;*代表当前分支&#xff09; git checkout -b order 新建分支order git push -u origin order 将本地的当前分支提交到云端仓库origin中命名为order 通过路由方式…

“工控机”是什么?和普通电脑有区别嘛!

在现代工业生产中,有一种特殊的计算机,它不像普通电脑那样被放置于明亮的办公室内,而是常常藏身于机器轰鸣、环境恶劣的工厂车间里,这就是工控机——工业控制计算机的简称。作为工业自动化领域不可或缺的核心设备,工控机不仅承载着监控与数据采集(SCADA)、过程控制、数据…

LLM大模型安全概述

引言 2022年底以来&#xff0c;以ChatGPT为代表的大模型飞速发展&#xff0c;正在成为#驱动新质生产力发展#​的新动能、人类探索未知的新工具. 在显著提升人工智能(artificial intelligence, AI)模型通用理解和生成能力的同时&#xff0c;也带来了前所未有的安全风险. 大模型…

plugin:vite:import-analysis]No known conditions for“./lib/locale/lang/zh-cn“

将原有引入&#xff1a; import zhCn from element-plus/lib/locale/lang/zh-cn 改成&#xff1a; import zhCn from element-plus/es/locale/lang/zh-cn; 原因版本升级&#xff0c;引入路径改变&#xff08;原先的包在node_modules\element-plus\lib找不到&#xff09; 新…

数据预处理:统计关联性分析/数据清洗/数据增强/特征工程实例

专栏介绍 1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。 2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。 3.需要强调的是,专栏仅介绍主…

科技赋能智慧应急:“数字孪生+无人机”在防汛救灾中的应用

近期&#xff0c;全国多地暴雨持续&#xff0c;“麻辣王子工厂停工”“水上派出所成水上的派出所了”等相关词条冲上热搜&#xff0c;让人们看到了全国各地城市内涝、洪涝带来的严重灾情。暴雨带来的影响可见一斑&#xff0c;潜在的洪水、泥石流、山体滑坡等地质灾害更应提高警…

UartAssist 串口助手,存储文件 打开是乱码

问题描述 使用UartAssist 对采集的串口数据进行存储&#xff0c;存储为日志格式的文件&#xff0c;但打开的文件有些可正常显示&#xff0c;大部分打开是乱码&#xff1b; (串口输出无中文) 若打开的文本为 UTF-16&#xff0c;则为乱码&#xff0c;若是ANSI格式&#xff0c;则可…

【MySQL】库的操作【创建和操纵】

文章目录 1.创建数据库1.1字符集和校验规则1.查看系统默认字符集以及校验规则2.查看数据库支持的字符集以及校验规则 1.2校验规则对数据库的影响1.创建一个数据库&#xff0c;校验规则使用utf8_ general_ ci[不区分大小写]2.创建一个数据库&#xff0c;校验规则使用utf8_ bin[区…

HTML内容爬取:使用Objective-C进行网页数据提取

网页爬取简介 网页爬取&#xff0c;通常被称为网络爬虫或爬虫&#xff0c;是一种自动浏览网页并提取所需数据的技术。这些数据可以是文本、图片、链接或任何网页上的元素。爬虫通常遵循一定的规则&#xff0c;访问网页&#xff0c;解析页面内容&#xff0c;并存储所需信息。 …

继电器测试的价格和性价比如何?

继电器是广泛应用于各种电气控制系统中的开关元件&#xff0c;其主要功能是在输入信号的控制下&#xff0c;实现电路的断开和闭合。继电器的性能和质量直接影响到整个电气系统的稳定性和可靠性&#xff0c;因此对继电器进行严格的测试是非常必要的。那么&#xff0c;继电器测试…

软考-系统架构设计师[九年]上岸感想

2016年就开始参系统架构设计师的考试了&#xff0c;经历七次考试终于成功上岸&#xff0c;分享下自己这么多次考试失败的经验&#xff0c;希望大家可以少踩坑&#xff0c;一次通过考试 重点 如果你不想继续读下去&#xff0c;看完这段就行。 1.一定要知道最新的考试范围&…

VTK- 面绘制体绘制

在VTK中&#xff0c;面绘制&#xff08;Surface Rendering&#xff09;和体绘制&#xff08;Volume Rendering&#xff09;是两种常见的三维数据可视化方法。面绘制和体绘制是计算机图形学中用于三维数据可视化的重要技术&#xff0c;尤其在医学成像、科学可视化和计算机辅助设…

03.C1W2.Sentiment Analysis with Naïve Bayes

目录 Probability and Bayes’ RuleIntroductionProbabilitiesProbability of the intersection Bayes’ RuleConditional ProbabilitiesBayes’ RuleQuiz: Bayes’ Rule Applied Nave Bayes IntroductionNave Bayes for Sentiment Analysis P ( w i ∣ c l a s s ) P(w_i|clas…

OWASP ZAP安全扫描工具,扫描网站

OWASP ZAP (Zed Attack Proxy) 是一个功能强大的开源 web 应用程序安全扫描工具&#xff0c;用于发现和利用 web 应用程序中的漏洞。以下是如何安装和使用 OWASP ZAP 的步骤。 安装 OWASP ZAP 使用 Snap 安装&#xff1a; 在 Ubuntu 22.04 上可以通过 Snap 安装 OWASP ZAP&…

打造商贸物流“产-供-销”、“仓-运-配”全流程供应链

在当今全球化的商业环境中&#xff0c;商贸物流平台的搭建成为企业提升效率、降低成本并增强市场竞争力的关键因素。在现代商业环境中&#xff0c;商贸与物流之间的紧密协作是业务成功的关键因素。然而&#xff0c;许多组织面临着信息不对称、资源配套不足、以及系统间隔离等痛…

设计模型 - 学习笔记

学习参考&#xff1a; https://blog.csdn.net/m0_65346405/article/details/136994128 《系统分析师教程》 《设计模式之禅》 一. 设计模式的5大原则 1. 单一职责原则 一个类应该只有一个变化因子。 就是说&#xff0c;一个类要变化&#xff0c;比如增加功能&#xff0c;那么引…

DllImport进阶:参数配置与高级主题探究

深入讨论DllImport属性的作用和配置方法 在基础篇中&#xff0c;我们已经简单介绍了DllImport的一些属性。现在我们将深入探讨这些属性的实际应用。 1. EntryPoint EntryPoint属性用于指定要调用的非托管函数的名称。如果托管代码中的函数名与非托管代码中的函数名不同&#…