Redis 键值类型及其存储结构

news2024/11/24 6:49:15

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

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

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

相关文章

《深入理解计算机系统》书籍学习笔记 - 第二课 - 位,字节和整型

Lecture 02 Bits,Bytes, and Integer 位,字节和整型 文章目录 Lecture 02 Bits,Bytes, and Integer 位,字节和整型Byte 字节位操作布尔代数集合的表现形式和操作C语言的逻辑操作 位移操作整型数值范围无符号与有符号数值无符号与有符号在C中 拓展和截断拓…

个人网厅——提取

目录 需求文档 公积金提取类 controller层 service层 service层实现类 1.验证(个人账户) 2.提交(添加) controller层 service层 service层实现类 3.分页查询 controller层 service层 service层实现类 4.详情查询 co…

键盘打字盲打练习系列之认识键盘——0

一.欢迎来到我的酒馆 盲打,yyds! 目录 一.欢迎来到我的酒馆二.开始练习 二.开始练习 经常看视频,看到别人在键盘上一通干净利索的操作,就打出想要的文字。心里突然来一句:卧槽,打字贼快啊!思索下…

【Java笔试强训】Day9(CM72 另类加法、HJ91 走方格的方案数)

CM72 另类加法 链接:另类加法 题目: 给定两个int A和B。编写一个函数返回AB的值,但不得使用或其他算数运算符。 题目分析: 代码实现: package Day9;public class Day9_1 {public int addAB(int A, int B) {// wr…

解析找不到msvcr100.dll文件的解决方法,4个方法修复msvcr100.dll

msvcr100.dll是Microsoft Visual C 2010运行库的组成部分,一些基于Visual C开发的软件运行时会依赖这个dll文件。出现“找不到msvcr100.dll”的错误提示,往往意味着这个文件在你的计算机系统中丢失或损坏,导致相关程序无法正常运行。以下是找…

【Android】画面卡顿优化列表流畅度一

卡顿渲染耗时如图: 卡顿表现有如下几个方面: 网络图片渲染耗时大上下滑动反应慢,甚至画面不动新增一页数据加载渲染时耗时比较大,上下滑动几乎没有反应,画面停止没有交互响应 背景 实际上这套数据加载逻辑已经运行…

数字化广告运营,小迈科技的关键一步

数据驱动广告运营是小迈科技提升整体经营效率、构建竞争优势的重要选择。 截止目前,小迈科技已经完成了数据驱动的广告运营体系的搭建,并通过与神策数据的深入合作,借力神策客户旅程分析平台,在广告投放、运营活动等各个环节实现了…

Samtec连接器技术前沿 | 全新对准功能确保测试和测量应用中的精确对准

【摘要/前言】 Samtec开发了一种创新的易于使用的对准技术,以确保测试和测量应用中的精密、高频压缩安装连接器的峰值性能。下面解释了我们所看到的趋势,并概述了我们针对出现的常见对准挑战所开发的解决方案。 【问题所在】 随着数据传输率的不断提高…

C++的Odyssey之旅——STL

W...Y的主页 😊 代码仓库分享💕 🍔前言:我们已经将基本语法了解的差不多了,现在我们就该进入C中最重要也是最富有特点的一部分——STL。在学习C语言中我们想要使用顺序表、链表等一些数据结构进行做题时都需要进行这…

pyinstaller 错误排查的验证史

在pyinstaller打包时出现如下错误,很明显感觉是路径被转义 或者历史迁移导致的 报错路径:OSError: [WinError 123] 文件名、目录名或卷标语法不正确。: D:\t_job\x07naconda3_20201121\\Lib\\site-packages 安装路径:File "D:\11_job\…

这些机器视觉工程师犯法了,竟然在闲鱼或淘宝上卖公司的机器视觉程序架构源码

目录 ​从个人层面来讲:从公司层面来讲: ​从个人层面来讲: 个人是法盲,法律意识淡薄只是一方面,另外一个方面就是对于代码的所有权,以及代码的安全性重视不够。把机器视觉程序架构源码打包在闲鱼或淘宝上…

软件测试/测试开发丨接口测试Mock实战练习学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27857 一、Rewrite 1.1、Rewrite 原理 1.2、Rewrite 实战 Tools → Rewrite 勾选 Enable Rewrite 点击下方 Add 按钮新建一个重写的规则 在右侧编辑重…

制作一个模板

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

【紫光同创国产FPGA教程】【PGC1/2KG第七章】7.数字钟实验例程

本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 适用于板卡型号: 紫光同创PGC1/2KG开发平台(盘古1K/2K) 一:盘古1K/2K开发板(紫光同创PGC…

工厂设备扫码使用售卖联网开发需要怎么开发开源代码?

我们将详细介绍如何使用开源代码开发一套用于工厂设备联网统计的系统。我们将详细讨论所需硬件组件的选择、开源框架和库的使用、软件开发流程以及最后的集成和部署。在这个过程中,我们将提供实用的操作步骤和指导,帮助你更容易地完成这个复杂的任务。 …

leaflet:利用Leaflet-Geoman绘制多种图形,导出为geojson文件(135)

第135个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中利用Leaflet-Geoman绘制多种图形,导出为geojson文件。 灵活地配置Leaflet-Geoman的属性,可以产生各种美妙的绘图效果。利用FileSaver可以导出geojson文件。 直接复制下面的 vue+leaflet源代码,操作2分钟…

C语言求解一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

完整代码&#xff1a; /* 一个整数&#xff0c;它加上100后是一个完全平方数&#xff0c;再加上168又是一个完全平方数&#xff0c;请问 该数是多少&#xff1f;*/ #include<stdio.h>int main(){//num为最终所求那个数int num;//i*i为第一个完全平方数for (int i 10; …

实验5-1——本地yum源的配置

本地yum源的配置 实验步骤&#xff1a; 1.挂载磁盘(可以看这篇博客&#xff1a;磁盘的挂载和卸载&#xff09; &#xff08;1&#xff09;创建挂载点 mkdir /mnt/cdrom &#xff08;2&#xff09;挂载磁盘 mount /dev/sr0 /mnt/cdrom #或者 mount /dev/cdrom /mnt/cdrom …

嵌入式养成计划-47----QT--基于QT的OpenCV库实现人脸识别功能

一百二十一、基于QT的OpenCV库实现人脸识别功能 121.1 UI 界面 登录按钮现在没啥实际作用&#xff0c;因为没加功能&#xff0c;可以添加在识别成功后运行的功能代码 121.2 思路 显示人脸&#xff1a; 通过 VideoCapture 这个类下面的 open() 方法打开摄像头&#xff0c;对…

算法进阶指南图论 最优贸易

最优贸易 题目描述 C C C 国有 n n n 个大城市和 m m m 条道路&#xff0c;每条道路连接这 n n n 个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m m m 条道路中有一部分为单向通行的道路&#xff0c;一部分为双向通行的道路&#xff0c;双向通行的…