Redis 五大数据类型底层原理

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.mzph.cn/news/865992.shtml

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

相关文章

14-23 深度神经网络的主要架构(RNN/LSTM/CNN)

神经网络架构 神经网络的架构决定了这些网络如何运行&#xff0c;这是执行各种任务和扩展神经网络应用的关键因素&#xff0c;主要有两种方法&#xff1a;前馈神经网络和反馈神经网络。在本文中&#xff0c;在彻底分析每种方法之后&#xff0c;我们将对这两种架构进行深入比较…

规则·理解·成长:与自闭症儿童共绘记忆蓝图

在星贝育园&#xff0c;作为专注于自闭症儿童康复的专业教育者&#xff0c;我们常常遇到家长的疑惑&#xff1a;“为什么我的孩子总是记不清楚规则&#xff1f;”这个问题触及了自闭症谱系障碍&#xff08;ASD&#xff09;儿童在理解与遵守规则方面面临的独特挑战。下面&#x…

每日一题——Python实现PAT乙级1005 继续(3n+1)猜想(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码逻辑概述 时间复杂度分析 空间复杂度分析 总结 我要更强 代码优化点…

【MySQL基础篇】函数及约束

1、函数 函数是指一段可以直接被另一段程序程序调用的程序或代码。 函数 - 字符串函数 MySQL中内置了很多字符串函数&#xff0c;常用的几个如下&#xff1a; 函数功能CONCAT(S1,S2,...,Sn)字符串拼接&#xff0c;将S1,S2,...,Sn拼接成一个字符串LOWER(str)将字符串str全部…

一文入门“机器学习-参数调整”实操

作者前言: 通过向身边的同事大佬请教之后&#xff0c;大佬指点我把本文的宗旨从“参数调优”改成了“参数调整”。实在惭愧&#xff0c;暂时还没到能“调优”的水平&#xff0c;本文只能通过实操演示“哪些操作会对数据训练产生影响”&#xff0c;后续加深学习之后&#xff0c;…

Python 学习中,什么是列表,如何操作列表?

什么是列表 在Python中&#xff0c;列表&#xff08;List&#xff09;是一种内置的数据结构&#xff0c;用于存储一系列有序的元素。列表中的元素可以是任意类型&#xff0c;比如整数、字符串、浮点数&#xff0c;甚至是另一个列表。列表是可变的&#xff08;mutable&#xff…

Android系统常见的crash分类error有那些?

Android系统常见的crash分类及其对应的error主要包括以下几类&#xff1a; 一、Java Application Crash Java Application Crash通常是由于Java层线程因未捕获异常而终止&#xff0c;由系统的void uncaughtException(Thread t, Throwable e)方法进行捕获和处理。这类crash常见…

【热部署】✈️Springboot 项目的热部署实现方式

目录 &#x1f378;前言 &#x1f37b;一、热部署和手动重启 &#x1f37a;二、热部署的实现 2.1 手动启动热部署 2.2 自动检测热部署 2.3 关闭热部署 &#x1f49e;️三、章末 &#x1f378;前言 小伙伴们大家好&#xff0c;书接上文&#xff0c;通过Springboot 中的 actu…

git clone报错RPC failed; curl 92 HTTP/2 stream 7 was not closed cleanly

问题描述 git clone github上的项目报错: RPC failed; curl 92 HTTP/2 stream 7 was not closed cleanly: CANCEL (err 8) 4796 bytes of body are still expected fetch-pack: unexpected disconnect while reading sideband packet early EOF fetch-pack: invalid index-pac…

Selenium:原理与使用指南

文章目录 简介Selenium 的原理安装 Selenium基本使用示例代码说明 常用操作查找元素交互操作等待处理弹窗 高级功能截屏执行 JavaScript切换窗口 结论 简介 Selenium 是一个用于 Web 应用程序自动化测试的强大工具。它提供了一系列库和工具&#xff0c;支持多种浏览器和编程语…

提升TK直播体验:使用美国直播网络的六大优势

国内有许多公司想在TikTok上进行美国直播&#xff0c;但由于TikTok的政策限制&#xff0c;在国内直接访问存在困难。然而&#xff0c;通过使用Ogcloud的美国直播网络&#xff0c;这一问题得以解决。那么&#xff0c;TikTok海外直播使用美国直播网络具体有哪些优势呢&#xff1f…

【懒删除堆 优先队列】1172. 餐盘栈

本文涉及知识点 懒删除堆 优先队列 LeetCode1172. 餐盘栈 我们把无限数量 ∞ 的栈排成一行&#xff0c;按从左到右的次序从 0 开始编号。每个栈的的最大容量 capacity 都相同。 实现一个叫「餐盘」的类 DinnerPlates&#xff1a; DinnerPlates(int capacity) - 给出栈的最大…

封装方法实现表格合并

封装方法 const mergeTableRow (config:any)> {let data config.dataconst {mergeColNames, // 需要合并的列firstMergeColNames, // 受影响的列firstMerge // 以哪列为基础进行合并(基准列)} configif (!mergeColNames || mergeColNames.length 0) {return data}merge…

中位数贪心,3086. 拾起 K 个 1 需要的最少行动次数

一、题目 1、题目描述 给你一个下标从 0 开始的二进制数组 nums&#xff0c;其长度为 n &#xff1b;另给你一个 正整数 k 以及一个 非负整数 maxChanges 。 Alice 在玩一个游戏&#xff0c;游戏的目标是让 Alice 使用 最少 数量的 行动 次数从 nums 中拾起 k 个 1 。游戏开始…

Java基础(基于韩顺平老师的笔记)

Java基础 Java特点环境搭建Java 基础语法数据类型流程控制 数组面向对象方法重载封装多态继承 类类变量&#xff08;又叫静态变量&#xff09;类方法&#xff08;又叫静态方法&#xff09; 接口枚举常用类String日期时间 集合类泛型注解异常处理多线程IO 流反射经典面试题&…

谷歌GMS认证之安卓Android Auto认证,车机的Android Auto认证介绍,GAS跟Android Auto区别

一、Android Auto认证前言 Android Auto 是谷歌&#xff08;Google&#xff09;推出的一个车载平台&#xff0c;它允许驾驶者将他们的Android设备&#xff08;如智能手机&#xff09;连接到车辆的显示屏上&#xff0c;以便在驾驶时更安全和方便地使用某些应用程序和服务。 为…

stm32中IIC通讯协议

参考资料&#xff1a;大部分均引用b站江协科技课程、GPT及网络资料 什么是IIC&#xff08;i2C&#xff09;通讯协议&#xff1f; 关键字&#xff1a;SCL、SDA、半双工、同步、串行。 IIC&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;也称为I2C&#xff08;In…

不同的llm推理框架

vLLM适用于大批量Prompt输入&#xff0c;并对推理速度要求比较高的场景。 实际应用场景中&#xff0c;TensorRT-LLM通常与Triton Inference Server结合起来使用&#xff0c;NVIDIA官方能够提供更适合NVIDIA GPU运行的高效Kernel。 LightLLM比较轻量、易于扩展、易于上手&…

【chatgpt】 PyTorch中dtype属性,表示张量的数据类型

在 PyTorch 中&#xff0c;dtype 是一个属性&#xff0c;用于表示张量的数据类型。dtype&#xff08;数据类型&#xff09;决定了张量中元素的存储方式和计算方法。 常见的数据类型 PyTorch 支持多种数据类型&#xff0c;常见的数据类型包括&#xff1a; torch.float32 或 t…

Linux—KVM虚拟化中使用基本命令管理虚拟机(纯实例)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年7月2日11点11分 &#x1f004;️文章质量&#xff1a;94分 文章目录 前言 1.查看命令帮助 2.查看KVM 的…