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

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

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

相关文章

响应式成人高考自考教育机构网站模板源码下载带后台

模板信息: 模板编号:30558 模板编码:UTF8 模板分类:学校、教育、培训、科研 适合行业:教育机构类企业 模板介绍: 本模板自带eyoucms内核,无需再下载eyou系统,原创设计、手工书写DIVC…

解密Elasticsearch:深入探究这款搜索和分析引擎

•开篇 最近使用Elasticsearch实现画像系统,实现的dmp的数据中台能力。同时调研了竞品的架构选型。以及重温了redis原理等。特此做一次es的总结和回顾。网上没看到有人用Elasticsearch来完成画像的。我来做第一次尝试。 背景说完,我们先思考一件事&…

UseGalaxy.cn生信云平台文本文件操作手册

文本文件是生物信息学中应用非常广泛的文本格式,甚至可以说是最重要的文件格式,比如常见的测序下机数据Fastq、参考基因组保存格式Fasta、比对文件SAM,以及突变列表VCF,它们都是文本文件。熟练地进行文本文件的处理,对…

springboot内容协商

1.基于请求头 Accept: application/json Accept: application/xml Accept: application/xxx 自定义数据 发的请求头的数据类型 期望返回的数据类型 2.通过请求参数 例如 /football?formatjson 一般respondbody 默认以json方式进行返回 如何请求同一个接口,可以…

DAIR-V2X-V 3D检测数据集 转为Kitti格式 | 可视化

本文分享在DAIR-V2X-V数据集中,将标签转为Kitti格式,并可视化3D检测效果。 一、将标签转为Kitti格式 DAIR-V2X包括不同类型的数据集: DAIR-V2X-IDAIR-V2X-VDAIR-V2X-CV2X-Seq-SPDV2X-Seq-TFDDAIR-V2X-C-Example: google_drive_linkV2X-Seq-…

ASP.NETCore6开启文件服务允许通过url访问附件(图片)

需求背景 最近在做一个工作台的文件上传下载功能,主要想实现上传图片之后,可以通过url直接访问。由于url直接访问文件不安全,所以需要手动开启文件服务。 配置 文件路径如下,其中Files是存放文件的目录: 那么&…

深度学习入门-基于Python的理论与实现摘要记录

基本是《深度学习入门-基于Python的理论与实现》的复制粘贴,以作为日后的检索和查询使用 感知机 感知机接收多个输入信号,输出一个信号。 感知机原理 感知机接收多个输入信号,输出一个信号。 图2-1是一个接收两个输入信号的感知机的例子。…

【单目测距】单目相机测距(三)

文章目录 一、前言二、测距代码2.1、地面有坡度2.2、python代码2.2.1、旋转矩阵转角度2.2.2、角度转旋转矩阵2.2.3、三维旋转原理 (Rotation 原理)2.2.4、完整代码 2.3、c 代码 一、前言 上篇博客【单目测距】单目相机测距(二) 有讲到当相机不是理想状态…

Linux CentOS 8(HTTPS的配置与管理)

Linux CentOS 8(HTTPS的配置与管理) 目录 一、HTTPS 介绍二、SSL 证书的介绍三、实验配置 一、HTTPS 介绍 HTTPS 在 HTTP 的基础下加入 SSL,SSL 是“Secure Sockets Layer”的缩写,中文为“安全套接层”。因此 HTTPS 是以安全为目…

Qt 二维码生成与识别

1.简介 QZXing是一个基于Qt框架的二维码解码库,它是对ZXing(Zebra Crossing)开源项目的一个Qt封装。ZXing是一个功能强大的开源二维码解码库,支持多种类型的码,包括QR码、DataMatrix码、Aztec码等。 QZXing提供了一个…

【C++】一文简练总结【多态】及其底层原理&具体应用(21)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一.多态的概念二.多态的实现1&#xff…

SSM项目与Redis整合以及Redis注解式开发以及Redis击穿穿透雪崩

目录 前言 一、SSM项目整合Redis 1.导入pom依赖 2.Spring-redis相关配置 3.Spring上下文配置 二、redis注解式缓存 1.Cacheable 注解 2.CachePut 注解 3.CacheEvict 注解 三、redis击穿、穿透、雪崩 1. 缓存击穿 2. 缓存穿透 3. 缓存雪崩 前言 当将SSM项目与Red…

NSSCTF逆向题解

[SWPUCTF 2021 新生赛]简简单单的逻辑 直接把key打印出来,然后整理一下result,让key和result进行异或 key[242,168,247,147,87,203,51,248,17,69,162,120,196,150,193,154,145,8] data[0xbc,0xfb,0xa4,0xd0,0x03,0x8d,0x48,0xbd,0x4b,0x00,0xf8,0x27,0x…

uniapp中picker 获取时间组件如何把年月日改成年月日默认时分秒为00:00:00

如图所示,uniapp中picker组件的日期格式为: 但后端要 2023-11-08 00:00:00格式 如何从2023-11-08转化为 2023-11-08 00:00:00:👇 const date new Date(e.detail.value);//"2023-11-17" date.setHours(0, 0, 0); // 2…

docker部署MinIo

部署单个的MinIo 要在Docker中安装Minio,您可以按照以下步骤进行操作: 使用Docker命令拉取Minio镜像: docker pull minio/minio创建一个用于存储数据的本地目录。例如: mkdir -p /minio/path/to/data运行Minio容器&#xff1a…

[Linux/UOS]同一解决方案下的控制台程序依赖SO库的方法

该方法是基于VS2019的远程调试Linux的方案,使用的是UOS系统,本文不会去详述如何远程调试Linux和如何新建解决方案中的.so项目和.out项目 只关注于如何令.out项目依赖.so,并成功调用运行 以一个如上图结构的解决方案为例子,SysInfo…

合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(一)

基于ARM语音识别的智能家居系统 我们接下来带大家完成基于语音识别的智能家居系统嵌入式项目实战,使用到stm32开发板,讯飞的离线语音识别,我们在此之前,我们先学习一些Linux系统的基本操作。 。 一、Linux简介 在嵌入式开发中&am…

Linux开发工具的使用(vim、gcc/g++ 、make/makefile)

文章目录 一 :vim1:vim基本概念2:vim的常用三种模式3:vim三种模式的相互转换4:vim命令模式下的命令集- 移动光标-删除文字-剪切/删除-复制-替换-撤销和恢复-跳转至指定行 5:vim底行模式下的命令集 二:gcc/g1:gcc/g的作用2:gcc/g的语法3:预处理4:编译5:汇编6:链接7:函…

数字通信和fpga概述——杜勇版本学习笔记

1数字通信处理流程 脉冲调制是每个数字通信系统中间必不可少的环节,通常是使用升余弦滚降滤波器来实现。 超外差接收机原理是利用本地产生的振荡波与输入信号混频,将输入信号频率变换为某个预先确定的频率的方法。超外差原理最早是由E.H.阿姆斯特朗于1…

【理解链表指针赋值】链表中cur->next = cur->next->next->next与cur =cur->next->next的区别

最近在做链表的题目的时候,对于所定义的cur链表指针产生了一些疑惑,查阅资料后整理一下我的理解: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(n…