Redis中有常见数据类型

news2024/11/26 8:26:00

Redis的数据类型

string数据类型

string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何 数据,比如jpg图片或者序列化的对象

String类型是最基本的数据类型,一个redis中字符串value最多可以是512M

redis底层提供了三种不同的数据结构实现字符串对象,根据不同的数据自动选择合适的数据结 构。这里的字符串对象并不是指的纯粹的字符串,数字也是可以的

当保存的数据中包含字符时,String类型就会用简单动态字符串SDS结构体来保存

  •  redis中的String并不是以\0结束,而是根据len来决定文件是否结束。其主要目的是为了存储 非String的数据,例如图片,影像等二进制数据
  • 由于String结构体中存储了长度,所以在获得长度的时间复杂度为O(1)
  • String在扩容的时候,如果数据的长度小于10MB则,每次扩容为之前以后数据的2倍。如果超 过10MB则每次只增加1MB的长度 

主要应用场景:

  • 1、存储数据。如常见存储 K-V 字符串、JSON字符串。
  • 2、程序计数 INCR 命令递 增或递增一个数。
  • 3、分布式锁,使用 SET key value NX ,NX 不存在才写入。
  • 4、单点登录。可作 为存储共享会话实现单点登录。 

Hash数据类型

hash类型实际上是以key为标识存储key-value对。redis hash是一个string类型的field和value的映射 表,添加,删除操作都是平均O(1),hash特别适合用于存储对象 

有压缩链表ziplist和字典结构hashtable两种底层实现 

  • hashtable采用链地址法解决hash冲突问题
  • 当hash对象可以同时满足以下两个条件时,哈希对象使用ziplist编码,超过限制则使用 hashtable结构存储数据 

                哈希对象保存的所有键值对的键和值的字符串长度都小于64字节

                哈希对象保存的键值对数量小于512个 

ziplist编码的哈希对象使用压缩列表作为底层实现, 每当有新的键值对要加入到哈希对象时,会先 将保存了键的压缩列表节点推入到压缩列表表尾, 然后再将保存了值的压缩列表节点推入到压缩 列表表尾。

因此保存了同一键值对的两个节点总是紧挨在一起, 保存键的节点在前, 保存值的节点在后;先 添加到哈希对象中的键值对会被放在压缩列表的表头方向,而后来添加到哈希对象中的键值对会被 放在压缩列表的表尾方向

压缩列表并不是对数据利用某种算法进行压缩,而是将数据按照一定规则编码在一块连续的 内存区域,目的是节省内存

优点: 内存地址连续,省去了每个元素的头尾节点指针占用的内存

缺点: 对于删除和插入操作比较可能会触发连锁更新反应,比如在list中间插入删除一个元素 时,在插入或删除位置后面的元素可能都需要发生相应的移位操作。 

hashtable 编码的哈希对象使用字典作为底层实现, 哈希对象中的每个键值对都使用一个字典键 值对来保存:

  • 字典的每个键都是一个字符串对象, 对象中保存了键值对的键
  • 字典的每个值都是一个字符串对象, 对象中保存了键值对的值 

Hash类型两种编码方式,ziplist 与 hashtable。

  • hashtable 编码的哈希对象使用字典作为底层实现

ziplist 与 hashtable 编码方式之间存在单向转换

  • 既想节省Redis内存空间,又想存储对象数据,又想访问速度快,hash似乎是不二的选择 

List数据类型 

list是redis的一种基础数据结构,内部使用双向链表quicklist实现,所以向列表两端添加元素的时间复杂 度为O(1), 获取越接近两端的元素速度就越快 

redis中的列表对象经常被用作消息队列使用,底层有双向链表linkedList、支持双向遍历的压缩列表 zipList和quickList三种存储方式 

  • 在Redis3.2版本后,引入的qucikList是zipList和双向链表linkedList组成的混合体 

可以作链表使用 

双向链表linkedList链表是双端结构,listNode结构体中带有prev和next指针,因此获取某个节点 的前置节点和后继节点的时间复杂度都是O(1) 

  • 这个链表无环:表头节点的prev和表尾节点的next指针都指向了NULL,对链表的访问以 NULL为终点
  • 带表头指针和表尾指针:通过list结构的head指针和tail指针,程序获取链接的表头节点和表 尾节点的时间复杂度为O(1)
  • 带有链表长度计数器:程序使用list结构体的len属性来对list持有的链表节点进行计数,程序 获取链表中节点数量的复杂度为O(1)
  • 多态:链表节点使用void*指针来保存节点值,可以用于保存不同类型的值 

ziplist和linkedlist 

因为双向链表占用的内存比压缩列表要多, 所以当创建新的列表键时, 列表会优先考虑使用压缩 列表, 并且在有需要的时候, 才从压缩列表实现转换到双向链表实现

试图往列表新添加一个字符串值,且这个字符串的长度超过默认值64或者ziplist 包含的节点超过 默认值为 512 

因为双向链表占用的内存比压缩列表要多, 所以当创建新的列表键时, 列表会优先考虑使用压缩 列表, 并且在有需要的时候, 才从压缩列表实现转换到双向链表实现 试图往列表新添加一个字符串值,且这个字符串的长度超过默认值64或者ziplist 包含的节点超过 默认值为 512 

Redis中的列表list,在版本3.2之前,列表底层的编码是ziplist和linkedlist实现的,但是在版本3.2之后, 重新引入 quicklist,列表的底层都由quicklist实现。 

双向链表linkedlist便于在表的两端进行push和pop操作,在插入节点上复杂度很低,但是它的内 存开销比较大。首先,它在每个节点上除了要保存数据之外,还要额外保存两个指针;其次,双向 链表的各个节点是单独的内存块,地址不连续,节点多了容易产生内存碎片。

quickList是ziplist和linkedlist二者的结合,是一个ziplist组成的双向链表。每个节点使用ziplist来 保存数据。本质上来说,quicklist里面保存着一个一个小的ziplist

quickList就是一个标准的双向链表的配置,有head有tail;每个节点是一个quicklistNode,包含 prev和next指针。每一个quicklistNode包含一个ziplist,压缩链表里存储键值。所以quicklist是对 ziplist进行一次封装,使用小块的ziplist来既保证了少使用内存,也保证了性能。 

应用场景: 

  • 消息队列:列表类型可以使用 rpush 实现先进先出的功能,同时又可以使用 lpop 轻松的弹出(查 询并删除)第一个元素,所以列表类型可以用来实现消息队列
  • 文章列表:对于博客站点来说,当用户和文章都越来越多时,为了加快程序的响应速度,我们可以 把用户自己的文章存入到 List 中,因为 List 是有序的结构,所以这样又可以完美的实现分页功能, 从而加速了程序的响应速度。 

Zset有序集合 

有序集合对象zset和集合对象set没有很大区别,仅仅是多了一个分数score用来排序 

  • redis中的有序集合底层采用ziplist和skiplist跳表实现,当所有字符串长度都小于设定值值64字 节,并且所存元素数量小于设定值512个使用ziplist实现,其他情况均使用skiplist实现
  • 当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保 存,第一个节点保存元素的成员,第二个元素保存元素的分值
  • 有序集合的底层实现之一是跳表, 除此之外跳表它在 Redis 中没有其他应用 
  • 整数集合intset是集合键的底层实现之一: 当一个集合只包含整数值元素, 并且这个集合的元素数 量不多时, Redis 就会使用整数集合作为集合键的底层实现
  • 数据少时使用ziplist压缩列表,占用连续内存,每项元素都是(数据+score)的方式连续存储,按照 score从小到大排序。ziplist为了节省内存,每个元素占用的空间可以不同,对于大数据(long long),就多用一些字节存储,而对于小的数据(short),就少用一些字节来存储。因此查找的时候需 要按顺序遍历。ziplist省内存但是查找效率低
  • 跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访 问节点的目的,具有以下性质:

有很多层结构组成

每一层都是一个有序的链表,排列顺序为由高到低,都至少包含两个链表节点,分别是前面的 head节点和后面的nil节点

最底层的链表包含了所有的元素

如果一个元素出现在某一层的链表中,那么在该层之下的链表也全部都会出现

链表中的每个节点都包含两个指针,一个指向同一层的下一个链表节点,另一个指向下一层的 同一个链表节点 

  •  搜索,从最高层的链表节点开始,如果比当前节点要大和比当前层的下一个节点要小,那么则往下 找,也及时和当前层的下一层的节点下一个节点
  • 插入,首先确定插入的层数,有一种方法是抛一个硬币,如果是正面就累加,直到遇到反面为止, 最后记录正面的次数作为插入的层数,当确定插入的层数K后,则需要将新元素插入从底层到K层
  • 删除,在各个层中找到包含指定值得节点,然后将节点从链表中删除即可,如果删除以后只剩下头 尾两个节点,则删除这一层

 

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

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

相关文章

Allegro如何使用Snake命令走蛇形线操作指导

Allegro如何使用Snake命令走蛇形线操作指导 在做PCB设计的时候,遇到不规则BGA的时候,蛇形走线是惯用的走线方式,类似下图 Allegro支持蛇形走线,具体操作如下 首先把过孔打好,尽量上下左右间距一致,不容易出现偏差,如下图在Command命令栏下方输入snake,然后回车

常见字符串函数的使用,你确定不进来看看吗?

👦个人主页:Weraphael ✍🏻作者简介:目前是C语言学习者 ✈️专栏:C语言航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&a…

2023年最强大的12款数据可视化工具,值得收藏

做数据分析也有年头了,好的坏的工具都用过,推荐几个觉得很好用的,避坑必看! PS:一般比较成熟的公司里,数据分析工具不只是满足业务分析和报表制作,像我现在给我们公司选型BI工具,是做…

差分模拟信号转单端输出电路设计

需求分析: 1.差分输入0~16V -Vpp电压量; 2.输入频率0~1.2KHz; 3.单端对应输出0~3V的模拟量; 4.输出频率对应0~1.2KHz; 5.供电范围3~5V。 针对以上需求,设计如下图所示电路。 1.电路功能: …

Spring为什么这么火 之 Bean的6种作用域和Bean的生命周期

1、Bean的作用域 1.1、什么是作用域? 限定程序中变量的可用范围叫做作用域,或者说在源代码中定义变量的某个区域就叫做作用域 1.2、Bean的6种作用域 singleton:单例作用域prototype:原型作用域【多例作用域】request&#xff1…

Flowable进阶学习(九)数据对象DataObject、租户Tenant、接收任务ReceiveTask

文章目录一、数据对象DataObject二、租户 Tenant三、接收任务 ReceiveTask案例一、数据对象DataObject DataObject可以⽤来定义⼀些流程的全局属性。 绘制流程图,并配置数据对象(不需要选择任意节点) 2. 编码与测试 /*** 部署流程*/ Test…

C++类和对象(中)

✨个人主页: Yohifo 🎉所属专栏: C修行之路 🎊每篇一句: 图片来源 I do not believe in taking the right decision. I take a decision and make it right. 我不相信什么正确的决定。我都是先做决定,然后把…

java二叉排序树

1.先看一个需求 给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加 2.解决方案分析 使用数组 数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢. [示意图] 数组排序&#xf…

车道线检测-PolyLaneNet 论文学习笔记

论文:《PolyLaneNet: Lane Estimation via Deep Polynomial Regression》代码:https://github.com/lucastabelini/PolyLaneNet地址:https://arxiv.org/pdf/2004.10924.pdf参考:https://blog.csdn.net/sinat_17456165/article/deta…

Java中的clone方法

注解定义: 注解是一种注释机制,它可以注释包、类、方法、变量、参数,在编译器生成类文件时,标注可以被嵌入到字节码中。注解的分类:内置注解Override :重写方法,引用时没有该方法时会编译错误public class …

使用 ThreeJS 实现第一个三维场景(详)

文章目录参考描述index.html三维场景的基本实现导入 ThreeJS准备工作场景摄像机视锥体正交摄像机透视摄像机渲染器后续处理将摄像机添加至场景中移动摄像机设置画布尺寸将渲染器创建的画布添加到 HTML 元素中渲染物体结构材质合成将物体添加至场景中代码总汇执行效果动画reques…

Python基础及函数解读(深度学习)

一、语句1.加注释单行注释:(1)在代码上面加注释: # 后面跟一个空格(2)在代码后面加注释:和代码相距两个空格, # 后面再跟一个空格多行注释:按住shift 点击三次"&am…

蓝桥杯刷题023——机器人塔(DFS)

2016国赛 题目描述 X 星球的机器人表演拉拉队有两种服装,A 和 B。 他们这次表演的是搭机器人塔。 类似: A B B A B A A A B B B B B A B A B A B B A 队内的组塔规则是: A 只能站在 AA 或 BB 的肩上。 B 只能站在 AB 或 BA 的肩上。 你的任务…

擎创动态 | 定了!建设银行首批生态合作伙伴

1月31日,建设银行以“云行金融之道,建可信未来”为主题在北京举办“建行云”发布会,首批推出三大类10个云服务套餐,为行业提供一站式解决方案。发布会上,建设银行推出“云霄”生态合作计划并公布首批39家“建行云”生态…

基于vue-admin-element开发后台管理系统【技术点整理】

一、Vue点击跳转外部链接 点击重新打开一个页面窗口,不覆盖当前的页面 window.open(https://www.baidu.com,"_blank")"_blank" 新打开一个窗口"_self" 覆盖当前的窗口例如:导入用户模板下载 templateDownload() {wi…

化繁为简|中信建投基于StarRocks构建统一查询服务平台

近年来,在证券服务逐渐互联网化,以及券商牌照红利逐渐消退的行业背景下,中信建投不断加大对数字化的投入,尤其重视数据基础设施的建设,期望在客户服务、经营管理等多方面由经验依赖向数据驱动转变,从而提高…

面试阿里测开岗,面试官说我不配24K,当场拍桌子翻脸....

好家伙,这奇葩事可真是多,前两天和粉丝聊天,他说前段时间面试阿里的测开岗,最后和面试官干起来了。 我问他为什么,他说没啥,就觉得面试官太装了,我说要24K,他说太高了,说…

中国区注册OpenAI账号试用ChatGPT指南

OpenAI最近推出ChatGPT,但国内(包括香港)并不支持OpenAI账号注册,多数会提示: OpenAI’s services are not available in your country. 前期准备 科学上网,最好是美国IP(可以购买v屁n&#xf…

章鱼哥听歌

uboot环境变量 以下所有的命令,都在串口工具进行执行 ubifsmount- mount UBIFS volume ubifsumount- unmount UBIFS volume ums - Use the UMS [USB Mass Storage] usb - USB sub-system usbboot - boot from USB device version - print monit…

EasyX精准帧率控制打气球小游戏

🎆音乐分享 New Boy —— 房东的猫 之前都用Sleep()来控制画面帧率,忽略了绘制画面的时间 如果绘制画面需要很长的时间,那么就不能忽略了。 并且Sleep()函数也不是特别准确,那么就…