Redis 键值类型及其存储结构

Redis 键值类型及其存储结构

键值类型

键的数据类型是字符串,值的类型有:字符串、列表、Hash、集合、有序集合。

键的存储和查找

       Redis底层键的存储类似于Java中其他Hash存储结构:数组+链表的组合。数组中存储的是Key Hash函数对数组长度取模后相等的所有key组成列表的首元素,查找则是首先根据hash定位到数组位置所指向的列表首元素,然后遍历列表找到Hash值相等的key。

      

图1 Redis Key hash数据结构简单示意图

键的过期实现

检查过期可以为每个key设置timer或定时遍历所有key,但都有明显资源和性能消耗问题,Redis采用的实践:

  1. 查找是触发: 当查找KEY返回之前检查是否过期。
  2. 定期随机检查:定期随机抽查100条key,检测过期。

列表

列表采用压缩列表或双向循环链表的数据结构存储。

当列表中存储的数据量比较小的时候,列表采用压缩列表的方式实现。

  1. 列表中保存的单个数据(有可能是字符串类型的)小于 64 字节;
  2. 列表中数据个数少于 512

https://static001.geekbang.org/resource/image/49/b5/49fd8d46eb94f463ace98717f11c2cb5.jpg?wh=1142*381

压缩列表是为了节约内存而存在的。

Hash类型

Hash类型也同样使用压缩列表和散列表的组合。Redis 使用压缩列表来实现Hash类型有两个前提:

  1. Hash中保存的键和值的大小都要小于 64 字节。
  2. Hash中键值对的个数要小于 512 个。

其他情况下Redis 就使用散列表来实现字典类型。哈希函数 使用MurmurHash2

有序集合(sortedset)

SortedSet 使用压缩列表和跳表组合来存储有序集合。Redis使用压缩列表来实现有序集合的前提:

  1. 所有数据的大小都要小于 64 字节;
  2. 元素个数要小于 128 个。

       跳表结构是在链表结构上增加索引层,以支持快速地按照得分值、得分区间获取数据。

https://static001.geekbang.org/resource/image/14/8e/14753c824a5ee4a976ea799727adc78e.jpg

https://static001.geekbang.org/resource/image/49/65/492206afe5e2fef9f683c7cff83afa65.jpg

图2 跳表增加索引层示意图

跳表的插入:根据索引找到位置,直接插入

https://static001.geekbang.org/resource/image/65/6c/65379f0651bc3a7cfd13ab8694c4d26c.jpg

图3 跳表插入示意图

删除: 删除节点及对应索引。如上图删除元素7则将删除最底层的元素相应索引层中的索引7元素。

跳表索引动态更新

跳表元素的删除和增加会破坏跳表的索引的平衡性,跳表通过随机函数的方法来维持平衡:将数据插入随机索引层:随机数生成随机层次,进而插入随机索引层

数据结构持久化到硬盘

将内存中数据结构和数据持久化到硬盘有两种方式:

第一种是清除原有的存储结构,只将数据存储到磁盘中。当需要从硬盘还原数据到内存的时候,重新将数据组织成原来的数据结构。Redis 采用的就是这种持久化思路。

第二种方式是保留原来的存储格式,就是除了具体数据外还保存这相关数据结构的信息,如散列表需要将散列表的大小、每个数据被散列到的槽的编号等信息,都保存在硬盘中。当从硬盘中还原数据到内存中时,避免了重新计算Hash

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

制作一个模板

创建模拟对象是一种有用的技术,它允许您专注于应用程序的一部分,而不必担心系统中尚未存在的其他部分。我想设计应用程序的主页,我不想因为没有用户系统而分心,所以我只创建了一个用户对象,这样我就可以继续了。 应用…

Azure - 机器学习:使用自动化机器学习训练计算机视觉模型的数据架构

目录 一、用于训练的数据架构图像分类(二进制/多类)多标签图像分类对象检测实例分段 二、用于推理的数据格式输入格式输出格式图像分类多标签图像分类对象检测实例分段 了解如何设置Azure中 JSONL 文件格式,以便在训练和推理期间在计算机视觉…

集合贴2——数据

基础课10——人工智能的基础:大数据-CSDN博客文章浏览阅读126次。人工智能和大数据是相互依存、相互促进的关系。大数据是人工智能的重要基础,没有大数据,人工智能就难以发挥其作用。同时,人工智能也提供了处理和分析大数据的工具…

MCU测试科普|如何进行MCU芯片测试,具体流程是什么?

MCU芯片测试系统是一种专门用于检测MCU芯片性能和质量的综合性设备。它通常由硬件和软件两部分组成,硬件包括测试仪器、适配器、测试夹具等,用于连接被测MCU芯片和测试机,实现高效高精度的测试。软件部分通常包括测试程序、测试管理软件等&am…

摄像头内参准确性验证方法

前言 摄像头内参标定出来后,标定结果是否准确?有些内参准确性的验证方案需要很大的场地,且有很多误差源不好控制(特别是对视野比较大的摄像头),惠州市华阳数码特电子有限公司发明了一种占用场地小测试精度…

如何开发一个求职招聘小程序?详细步骤解析与教程

一、确定需求和功能 在开发求职招聘小程序之前,需要明确需求和功能。通过对市场和用户需求的调研和分析,确定小程序需要具备哪些功能,如职位发布、简历投递、在线沟通、面试安排等。 二、选择开发方式 求职招聘小程序的开发方式有多种选择…

Vim编辑器学习

B站学习vim指令链接 1:vim下有两种模式,一种是命令模式,一种是编辑模式 2:命令到编辑模式,按键盘i,编辑到命令格式按Esc 3::wq 保存并退出 :wq code.c保存并把文件命名为…

nginx发布vue项目

1、docker拉取nginx镜像 docker pull nginx:latest2、docker安装nginx # 第一个80端口是主机端口,第二个80端口是内部端口,主机的端口 80 映射到容器内部的端口80 docker run -d --name nginx -p 80:80 -p 443:443 nginx:lateste3、输入IP访问 说明我们…

docker形式简易部署kibana

文章目录 前言一、简易部署1.获取镜像2.启动应用4.访问页面5.总结 前言 记录下使用docker部署kibana服务的过程 一、简易部署 1.获取镜像 docker pull kibana:8.8.0[rootnginx ~]# docker pull kibana:8.8.0 8.8.0: Pulling from library/kibana Digest: sha256:a23d96ae0ae…

2023年11月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名(每月更新) 2023年11月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多,人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

于道 - 前端项目启动步骤参考

1. 安装 启动过程有9个步骤: 1.1 安装 Node JS , V18版本的 (安装步骤省略) 1.2 安装 npm install -g yarn ,node JS里边好像自带npm ,通过npm的命令安装 yarn 1.3 切换到项目中去安装,npm install &a…

使用决策树预测隐形眼镜类型

任务描述 本关任务:编写一个例子讲解决策树如何预测患者需要佩戴的隐形眼镜类型。使用小数据集,我们就可以利用决策树学到很多知识:眼科医生是如何判断患者需要佩戴的镜片类型,一旦理解了决策树的工作原理,我们甚至也…

mongodb分组查询

通过userId分组,得到结果字段为:_id和count db.my_solitaire.aggregate([{$group: {_id: "$userId", count: {$sum: 1}}}])通过userId分组得到分组字段和其他想要的字段,得到_id,userName,count userName 为…

【AICFD案例教程】汽车外气动-AI加速

AICFD是由天洑软件自主研发的通用智能热流体仿真软件,用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程,帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

Assertion `srcIndex < srcSelectDimSize` failed

报错如下&#xff1a; 将设备改为CPU&#xff0c;就定位到错误了&#xff1a; Traceback (most recent call last):File "./training.py", line 713, in <module>train_body_pixel()File "./training.py", line 685, in train_body_pixeltrainer.fi…

Linux下找出吃内存的方法

几个 个 Linux 内存查看方法 1、free命令 2、 vmstat命令 3、 /proc/meminfo 命令 4、 top命令 5、 htop 命令 6、查看进程内存信息 内存性能指标 系统内存使用情况&#xff0c;比如已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量等。 共享内存是通过 tmp…

RabbitMQ 消息中间件

消息中间件 1、简介 消息中间件也可以称消息队列&#xff0c;是指用高效可靠的消息传递机制进行与平台无关的数据交流&#xff0c;并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型&#xff0c;可以在分布式环境下扩展进程的通信。 当下主流的消息中间…

用Leangoo领歌免费敏捷工具做敏捷需求管理

传统的瀑布工作模式使用详细的需求说明书来表达需求&#xff0c;需求人员负责做需求调研&#xff0c;根据调研情况编制详细的需求说明书&#xff0c;进行需求评审&#xff0c;评审之后签字确认交给研发团队设计开发。在这样的环境下&#xff0c;需求文档是信息传递的主体&#…

Vue 将响应式数据转为普通对象

toRaw&#xff1a;将一个 reactive 生成的响应式数据转为普通对象。 toRaw 适用于&#xff1a;获取响应式数据对应的普通对象&#xff0c;对这个普通对象所有的操作&#xff0c;都不会引起页面的更新。 markRaw&#xff1a;标记一个对象&#xff0c;使其永远不会再成为响应式…

竞赛选题 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…