【redis的基本数据类型】

news2024/11/24 2:41:57

基本数据类型

Redis的基本数据类型有五种,分别是

  • String
  • List
  • Hash
  • Set
  • SortedSet 这些基本的数据类型构成了其他数据类型的基石,而这些基本数据类型又对应着不同的底层实现,不同的底层实现往往是针对不同的使用场景做的特殊的优化,下面将总结基本的数据类型,整理同底层实现的关系。

String

字符串在Redis使用是非常多的,虽然叫做字符串,但是其也能代表long类型,因此可以配合incr指令完成自增等等,作为数字类型,其比较省空间的,因为其复用了RedisObject中的指针字段(8字节)下面是RedisObject的结构,其分为两部分,8字节的Redis对象元数据信息,8字节的指针,其中Redis对象的元数据信息存储了类型的LRU信息,真正的编码格式等等,而如果字符串存储的是数字类型,则复用了8字节的指针的位置。

image.png

当其存储字符串的时候,则其指针则指向了Redis中的SDS结构,也就是简单动态字符串,既然是动态字符串,有动态二字说明其有自动扩容的能力,因此在SDS的基本结构中,存在capacitylen这两个基本的属性,来标识当前一共有多少空间可用,和使用了多少空间。

针对SDS的结构,Redis有两种不同的编码格式来存储简单动态字符串,分别是embstr编码和raw编码,其中embstr是紧凑型的,RedisObject和真正的字符串结构是连续存储的,而row格式编码则是分开存储的,依赖RedisObject中的指针来定位,当字符串的小于等于44字节的时候,使用embstr编码,其他的情况使用row编码,两种编码格式大概如下图所示。

image.png

需要注意的是,SDS在字符串的末尾增加了'\0',这样的好处了可以重用C函数,当然带来的坏处自然就是引入了定界符自然就不能支持完全的二进制数据了。

对于简单动态字符串,比较重要的就是其扩容机制,字符串长度小于1M使用加倍扩容方式,如果大小超过1M则扩容时以1M大小扩容。但是如果字符串总长度不能超过512M

List

列表的底层有不同的编码格式支持,其基本上可以看作一个链表,因此寻找下标多半是O(n)的操作,但是当列表的元素非常少的时候,其内部使用ziplist也就是压缩列表来存储,当元素特别多的时候,就转化为linkedlist了,不过为了减少malloc的调用次数以及减少碎片,Redis使用了多个ziplist串成一个链表实现,也就是所谓的quicklist快速列表。下面将对ziplistquicklist做一个简单的描述。

压缩列表是一个在内存中紧凑在一起的列表,其有一些基本的信息和entry以及在ziplist尾部的tail,是0xFF标记压缩列表结束。 压缩列表的基本信息包括压缩列表的大小,压缩列表的长度以及最后一个entry的偏移,之所以要有这个偏移,是为了找到最后一个entry,而每个entry都记录上一个元素的大小,通过计算就知道上一个entry的地址,这样方便的从后向前进行遍历。压缩列表结构如下所示。

image.png

由于内存紧凑的,当发生修改的时候很容易发生内存的重新分配和复制的过程,因此都是在元素较少的时候使用,不仅仅是listzsethash 容器对象在元素个数较少的时候也采用压缩列表。

快速列表quicklist是多个ziplist组成的双向链表,这样设计可以减少双向链表指针的开销,兼有ziplist的优势又有linkedlist的优势

Hash

和Java的HashMap类似,其采用的也是拉链法来解决Hash冲突,而不同的是对于Redis这样的中间件,多个服务可能都在用,在rehash方面为了避免一次性执行rehash操作带来的阻塞,使用了渐进式rehash,所谓渐进式Rehash就是将一次rehash操作拆解为多次执行,Redis内部对于Hash字典类型有两个hashtable,当需要扩容的时候,先分配内存。

  • 然后每处理一个请求,就将原来hashtable中的一个桶随机分配
  • Redis还会在定时任务中对字典进行主动搬迁

Redis的Hash是具有扩容和缩容的条件的

  • 一般情况下,当 hash 表中元素的个数桶的数目时,就会开始扩容,扩容的新数组是原数组大小的2倍
  • 缩容的条件是元素个数低于数组长度也就是桶个数的10%

Set

Set其实就是Value为null的hash,如果都存储的是整数类型的话,就会使用intset来进行编码,如果插入了非整数的值,encoding将会从intset变为hashtable的机构。 和ziplist相比,intset是有序的,可以进行二分查找,而ziplist是无序的

SortedSet

一个Set能排序自然而然想到的是基本的数据结构,TreeMap等AVLTree,而在Redis中使用SkipList来完成这样的工作。

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

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

相关文章

探索档案未来,尽在ARCHE-2024

2024年第三届上海国际智慧档案展览会暨高峰论坛(ARCHE-2024)将于2024年6月19日至21日在上海跨国采购会展中心隆重举行。深圳市铨顺宏科技有限公司应邀参展,将以全新形象盛装亮相,展示其在档案管理领域的最新技术和解决方案。 ARC…

Linux系统脚本开机自启动,开机自启动jar包vue前台等

脚本内容jiaobenname.sh #!/bin/bash # 设置环境变量 export JAVA_HOME/usr/local/java/jdk-17.0.10 export CLASSPATH.:$JAVA_HOME/lib/ export PATH.:$JAVA_HOME/bin:$PATHwhile true; doif ps aux | grep -v grep | grep "tomcat" > /dev/null; thenecho &quo…

Vue42-vc与vm的原型对象

一、普通函数与其对象的原型对象 显示原型属性,只有函数才有!!! 实例对象只有隐式原型属性。 普通函数与其对象,指向同一个原型对象!!! 这么写不推荐,建议直接如下格式&a…

C++初学者指南第一步---2. Hello world

C初学者指南第一步—2. Hello world 目录 C初学者指南第一步---2. Hello world1.源文件 “Hello.cpp”2.编译hello.cpp3.术语4.编译器标志5.不要使用 “using namespace std;” &#xff01; 1.源文件 “Hello.cpp” #include <iostream> // our first program int main…

3.多层感知机

目录 1.感知机训练感知机XOR问题&#xff08;Minsky&Papert 1969&#xff09; AI的第一个寒冬总结 2.多层感知机(MLP)学习XOR单隐藏层&#xff08;全连接层&#xff09;激活函数&#xff1a;Sigmoid激活函数&#xff1a;Tanh激活函数&#xff1a;ReLu 最常用的 因为计算速度…

LLM 学习之「向量数据库」

LLM 学习之「向量数据库」 什么是向量数据库&#xff1f; 向量数据库是一种以向量或数据点的数学表示形式存储数据的数据库。 人工智能和机器学习使非结构化数据能够转换为捕获意义和上下文的数字表示&#xff08;向量&#xff09;&#xff0c;这得益于自然语言处理和计算机视…

VSCode格式化插件-prettier

VSCode格式化插件 1.安装插件&#xff1a;prettier 2.设置默认格式化工具 设置中&#xff0c;搜索 “Default Formatter”。 在编辑器设置中&#xff0c;将默认格式化工具设为 Prettier。 3.启用格式化选项&#xff1a; 在设置中搜索 “Format On Save”&#xff0c;并勾选…

git回滚项目至指定版本

用过两种方式 1.使用git命令 进入到项目目录地址&#xff0c;使用git log查看提交版本信息 按q退出 若非对应分支&#xff0c;使用git checkout 分支名 切换分支 这里回退至上一个版本 git reset --hard 版本号 再次推送即可 这里需要使用-f命令 强行推送 2.在pycharm中…

12.容器间的互联(--link 是单方向的!!!)

容器间的互联&#xff08;–link 是单方向的&#xff01;&#xff01;&#xff01;&#xff09; –link意思就是链接容器进行通信 用法&#xff1a;--link 容器名字:随意设置别名&#xff1b;例如&#xff1a;--link nginx:nginx 注释&#xff1a;同一个容器中&#xff0c;可…

C#的Switch语句(在C#中如何根据结果执行不同的代码)

文章目录 基本语法示例 注意使用goto跳转其他标签 基本语法 switch语句是一种选择结构&#xff0c;用于基于某个表达式的值执行不同的代码块。它提供了一种更简洁、更易读的方式来处理多路分支逻辑&#xff0c;相比于多个嵌套的if…else if…else语句。下面是switch语句的基本…

C++语法07 程序中的除法和求余

程序中的除法 int / int int double / int double int / double double double / double double 规律总结 只要除号任意一边出现了double类型&#xff0c;结果就是double类型 只有除号两边都是int类型&#xff0c;结果才是int类型 这个规律也适用于加法减法和乘法 …

Mybatis框架中结果映射resultMap标签方法属性收录

Mybatis框架中结果映射resultMap标签收录 在MyBatis框架中&#xff0c;resultMap 是一种强大的机制&#xff0c;用于将数据库结果集映射到Java对象上。它允许你定义如何将查询结果中的列映射到Java对象的属性上&#xff0c;尤其是当数据库表的字段名与Java对象的属性名不一致时…

python全栈开发《07.数据类型之数字类型的应用、初识字符串类型》

目录 一、数字类型的简单应用二、初识字符串 1.什么是字符串2.字符串的内置函数与定义方法3.字符串的重要思想 三、python的内置函数id和len 一、数字类型的简单应用 对int与float的简单应用练习–初中生春游&#xff0c;主人公小编。 1.起因 小编学校组织春游&#xff0c;…

智能驾驶时代:车联网需要怎样的智能网络底座?

2024年&#xff0c;智能驾驶市场火热&#xff0c;无论是造车新势力还是老牌车企纷纷发力智能驾驶&#xff0c;他们深知&#xff0c;新能源汽车的下半场已到&#xff0c;再不发力智能驾驶&#xff0c;可能真的有些来不及了。车企不断加码单车智能的同时&#xff0c;政府也在稳步…

关于BERT和embedding

embedding到一个低维向量&#xff0c;但是需要回到onehot高维表示&#xff0c;所以大部分填词游戏最后都需要加上一个MLP接头。 word2vec如此简单的结构&#xff0c;学习到的是embedding 基于计数的统计方法和word2vec融合就形成了glove词嵌入模型 总结&#xff1a;通过各种…

FL Studio21.2.9最新中文永久激活码注册码

FL Studio21中文版本激活码注册码&#xff0c;这个好东西我真的要给大家种草一下&#xff01;&#x1f331; 让我来给大家介绍一下这款神奇的软件吧&#xff01;FL Studio21是一款非常专业的音乐制作软件&#xff0c;功能强大到让人惊叹&#xff01;&#x1f60d; 它可以帮助音…

AI预测福彩3D采取888=3策略+和值012路或胆码测试6月15日新模型预测第5弹

今天咱们继续验证新模型的8码定位3&#xff0c;目前新模型新算法8码定位经过4次测试&#xff0c;已命中3次&#xff0c;9码定位连续命中4次。咱们重点是预测8码定位3&#xff0b;和值012胆码。有些朋友看到我最近几篇文章没有给大家提供缩水后的预测详情&#xff0c;在这里解释…

使用docker构建自己的镜像并推送到远程镜像仓库

这里镜像仓库使用阿里云仓库&#xff0c;其他仓库可能类似&#xff0c;可以参考&#xff0c;个人实例可以免费使用。 背景 遇到的问题&#xff1a;需要定制一个自己的镜像&#xff0c;在上面安装一些环境&#xff0c;然后将镜像托管到公共镜像仓库&#xff0c;在其他地方使用…

什么是快乐?

什么是快乐&#xff1f; What is Happiness? 1. 快乐不是追求外在的物质&#xff0c;而是内心的平静与满足。当我们学会感恩&#xff0c;懂得珍惜眼前的一切&#xff0c;心中自然会充满喜悦。快乐并非来自拥有更多&#xff0c;而是感受到已经拥有的足够。每一天都怀抱感激之情…

04.VisionMaster 机器视觉找圆工具

VisionMaster 机器视觉找圆工具 定义 先检测出多个边缘点然后拟合成圆形&#xff0c;可用于圆的定位与测量 注意&#xff1a;找圆工具 最好和【位置修正】模块一起使用。具体可以看下面的示例。 参数说明&#xff1a; 扇环半径&#xff1a;圆环ROI的内外圆半径 边缘类型&a…