一、Hash类型简介

Redis的Hash类型是 Redis 3.2 版本引入的一个数据结构,它允许你在一个键下面存储多个字段和值。在 Redis 内部,Hash 类型可以有多种底层数据结构来实现,这取决于存储的数据量和特定的使用模式。哈希类型适用于存储对象,例如用户信息、商品详情等。通过使用哈希,可以更方便地对数据进行操作和查询。

Hash的底层数据结构在早期版本使用ZipList(压缩列表)和HashTable,在某些版本中(尤其是较新版本),Redis 可能还会使用 Quicklist 作为 Hash 类型的底层数据结构。Quicklist 是 ziplist 和 linkedlist(链表)的混合体,它通过多个 ziplist 节点组成一个链表来提高大数据量下的性能。Quicklist 提供了更好的性能平衡,特别是在需要频繁插入和删除操作时。在 Redis 7.0 中,ZipList数据结构已经废弃了,交由 ListPack 数据结构来实现了。

二、Hash使用场景

  • 存储用户信息:如果你需要存储用户信息,如用户名、邮箱、年龄等,可以使用 Redis Hash 存储。
  • 缓存对象:如果你有一个对象需要频繁更新和访问,可以将这个对象的属性以 Hash 的形式存储到 Redis 中。
  • 会话存储:可以使用 Redis Hash 存储用户会话信息,如用户的登录状态、购物车内容等。
  • 频繁更新的统计数据,如用户积分、访问次数等。
  • 程序中的频繁读取和偶尔更新的配置数据。
  • 存储地理位置信息的应用(如地图服务),Redis Hash 可以用来存储地点ID、经纬度、地址等信息。

三、底层编码方式

编码方式主要分两部分讲,一个是Redis6中的编码方式,一个是Redis7的编码方式。

在Redis6中,Hash数据结构的底层实现有两种编码方式,分别是ziplist(压缩列表)和hashtable(哈希表),Quicklist 是 ziplist 和 linkedlist(链表)的混合体,它通过多个 ziplist 节点组成一个链表来提高大数据量下的性能。Quicklist 提供了更好的性能平衡,特别是在需要频繁插入和删除操作时。在 Redis 7.0 中,ZipList数据结构已经废弃了,交由 ListPack 数据结构来实现了。

四、Hash底层数据结构

Redis的Hash类型的储存结构,分别是ZipLIst、Quicklis、ListPack和HashTable  ,下面对这些结构分别进行分析。

ZIPLIST底层数据结构

ZipList是经过特殊编码的双向链接列表,对于上面提到的LinkedList链表结构,由于内存中不是连续的,LinkedList多使用指针导致浪费内存空间、内存使用率都较低。为了解决这个问题,引入了 ZipList这种数据结构。 ZipList是一种有顺序、内存连续的数据结构。具备节省内存空间、提升内存使用率,适用于元素数量少且长度比较小的场景。在Redis 7.0版本之前是List、Hash、ZSet底层实现之一,但是自身也存在其他问题,因此在 Redis 7.0后被ListPack完全替换。

Ⅰ、ZIPLIST类对象

typedef struct ziplist{     /*ziplist分配的内存大小*/     uint32_t zlbytes;     /*达到尾部的偏移量 */     uint32_t zltail;     /*存储元素实体个数*/     uint16_t zllen;     /*存储内容实体元素*/     unsigned char* content[];     /*尾部标识*/     unsigned char zlend;}ziplist;
  • zlbytes:压缩列表的字节长度。
  • zltail:压缩列表尾元素相对于压缩列表起始地址的偏移量(目的是为了直接定位到尾节点,方便反向查询)。
  • zllen:压缩列表的元素个数。
  • entry:各个节点数据。
  • zlend:压缩列表的结尾,占一个字节,一直是0xFF(255)。

Ⅱ、ZIPLIST中节点(entry)类对象

typedef struct ziplistEntry {

    unsigned int pre_entry_len; // 前一个entry的长度编码大小

unsigned char encoding; // 节点编码方式

    unsigned char *content; // 指向当前entry数据的指针(节点的起始指针)

} ziplistEntry;

  • pre_entry_length: 记录了前一个节点的长度,通过这个值,可以进行指针计算,从而跳转到上一个节点。
  • 根据编码方式的不同, pre_entry_length 域可能占用 1 字节或者 5 字节:1 字节,如果前一节点的长度小于 254 字节,便使用一个字节保存它的值。5 字节,如果前一节点的长度大于等于 254 字节,那么将第 1 个字节的值设为 254 ,然后用接下来的 4 个字节保存实际长度。
  • encoding表示编码类型

字符串类型: 字符串类型有1、2、5三种编码长度,前两位表示编码类型,剩余位表示字符串长度。

00|aaaaaa:存储长度小于等于63byte的字符串。

01|aaaaaa bbbbbbbb:存储长度小于等于16383byte的字符串。

10|...... bbbbbbbb cccccccc dddddddd eeeeeeee:存储长度小于等于4294967295byte的字符串,'.'固定为0。

整数类型:整数类型的编码长度统一位1字节。

1100 0000:表示16位有符号整数,content占用2byte。

1101 0000:表示32位有符号整数,content占用4byte。

1110 0000:表示64位有符号整数,content占用8byte。

1111 0000:表示24位有符号整数,content占用3byte。

1111 1110:表示8位有符号整数,content占用1byte。

1111 0001 - 1111 1101:没有content部分,依次表示整数0-12。

  • content: 保存当前entry节点数据,可以是字符串或整数。

Ⅲ、ZIPLIST底层数据结构

Ⅳ、ZIPLIST数据结构存在问题

  • 查询效率

数据过多,导致链表过长,可能影响查询性能

  • 内存重分配&&连锁更新

ZipList 在更新或者新增时候,如空间不够则需要对整个列表进行重新分配。当新插入的元素较大时,可能会导致后续元素的prevlen 占用空间都发生变化,从而引起「连锁更新」问题,导致每个元素的空间都

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

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

相关文章

【Linux系统】初见线程,概念与控制

前言: 上文我们讲到了进程间信号的话题【Linux系统】万字解析,进程间的信号-CSDN博客 本文我们再来认识一下:线程! Linux线程概念 什么是线程 概念定义: 进程内核数据结构代码和数据(执行流) 线…

计算机视觉与深度学习 | 具身智能研究综述:从理论框架到未来图景

具身智能研究综述:从理论框架到未来图景 文章目录 具身智能研究综述:从理论框架到未来图景 一、定义与核心特征 二、关键技术体系 2.1 感知-运动融合技术 2.2 认知架构 2.3 强化学习进展 三、发展历程与里程碑 3.1 理论奠基期(1990-2005) 3.2 技术探索期(2006-2015) 3.3 …

玩转deepseek之自动出试卷可直接导出word

小伙伴们,最近有新同事入职,经理让我出一个关于sqlserver相关的试卷,想着既然有deepseek,我们就偷懒下直接用deepseek给我们自动生成出来。打开deepseek官网,输入提示词:出一套SQL的试题要有基础考察&#…

Flutter 语聊房项目 ----- 礼物特效播放

在语聊房项目中,礼物特效播放是一个常见的需求,通常包括动画、声音等多种媒体形式。为了处理不同的礼物类型,我们可以采用抽象的设计方法,使得系统易于扩展和维护。设计架构思路:抽象礼物特效接口:定义一个…

如何实现文件批量重命名自动化

在编程、设计、数据处理等工作中,脚本或软件往往要求文件名符合特定格式。 批量重命名可快速将文件调整为所需命名规则,避免手动操作出错。 它的体积不到300KB,解压后直接运行,完全绿色无安装。 界面清爽,操作直观&a…

【数据结构——图与邻接矩阵】

引入 树的遍历方式可分为深搜和广搜,这同样适用于图,不过有些地方会有出入。 树的节点结构从根到叶子节点都是1:n,到叶子节点后就没有了。而对于图来说,如果到了最底下的节点,它可能除了连接已经记录过的上层节点&am…

Quarkus - 超音速亚原子Java,开启云原生应用新视界!

Quarkus - 超音速亚原子Java框架 Quarkus 是一个以云为中心、优先考虑(Linux)容器的框架,专为编写 Java 应用而设计。它旨在帮助开发者更轻松地构建和部署大规模的容器化 Java 应用,采用了一系列现代开发理念和标准。 核心特点 …

如何查看GPU运行情况:使用 Conda 安装 nvitop 新手指南

文章目录 🔍 1. 为什么推荐使用 Conda 环境安装 📥 2. 安装步骤 步骤 1: 安装 Miniconda 或 Anaconda (如果你还没有安装的话) 步骤 2: 创建并激活一个专门的 Conda 环境 步骤 3: 在 Conda 环境中安装 nvitop 步骤 4: 验证安装 ⚠️ 3. 疑难解答 📖 4. nvitop 的基本使用…

遥感机器学习专栏简介

专栏定位与受众本专栏聚焦「机器学习 遥感应用」的落地实践,专为遥感相关专业大学生、刚入门的遥感工程师、机器学习爱好者打造。避开纯理论堆砌,以「实验课式实操」为核心,帮你解决 “懂理论但不会用代码落地”“遥感数据处理与模型结合难”…

【更新至2024年】1996-2024年各省农业总产值数据(无缺失)

【更新至2024年】1996-2024年各省农业总产值数据(无缺失) 1、时间:1996-2024年 2、来源:国家统计局、各省年检 3、指标:农业总产值 4、范围:31省 5、缺失情况:无缺失 6、指标解释&#xf…

大语言模型预训练流程

大语言模型训练流程 Pre-training → SFT → RLHF阶段1:预训练Pre-training 海量无标注文本数据训练自监督学习机制学习语言基础知识掌握语法、语义、常识形成语言表示能力 核心目标:建立模型的语言理解和文本生成基础能力 阶段2:监督微调Sup…

Zookeeper:分布式协调服务

一、概念ZooKeeper 是一个分布式的、开源的分布式应用程序协调服务,为分布式应用提供一致性、配置管理、命名服务、分布式同步和组服务等。可以把它想象成一个为分布式系统提供的“文件系统”“通知机制”,但它存储的不是普通的文件,而是少量…

海盗王客户端BMP纹理图片解密

海盗王客户端的纹理贴图bmp文件有些是加密,很多人想解密并修改替换,现在给出解密的python代码: import os import struct import copy from pathlib import Pathclass TexEncode:def __init__(self):self.MAGIC_BYTES bmp.x # 魔法字节标识…

《链式二叉树常用操作全解析》

目录 一.求链式二叉树节点个数 二.求链式二叉树叶子节点个数 三.求链式二叉树第k层节点个数 四.求链式二叉树的深度/高度 五.链式二叉树查找值为x的节点 六.链式二叉树的销毁 七. 测试函数 八. 总结: 前言: 在学习链式二叉树的常用操作之前 我们需要手动创建一个二叉树 在…

YOLO11目标检测运行推理简约GUI界面

YOLO11推理简约GUI界面使用方法:支持pt和onnx格式模型,并且自动检测设备,选择推理设备选择推理图片所在的文件夹 选择推理后的结果保存地址选择所需要的置信度阈值点击开始推理,程序自动运行 并在下方实时显示推理进度非常方便不用每次都改代…

集值优化问题:理论、应用与前沿进展

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 1. 📚 集值优化问题概述 集值优化问题主要研究目标函数为…

提示工程架构师分享:如何用提示词升级职业教育的实操案例教学?(万字长文来袭,高能预警!!!)

引言:实操案例教学的“困境”,终于有了破局思路? 晚上10点,汽修专业的王强老师还在电脑前修改《汽车发动机异响故障排查案例》——这已经是他本周第四次调整方案了: 第一次授课时,学生反馈“案例太理想化&a…

「日拱一码」087 机器学习——SPARROW

目录 SPARROW 介绍 核心思想:稀疏掩码训练 与 Lottery Ticket Hypothesis (LTH) 的关系 代码示例 代码关键点解释: 在机器学习领域,"SPARROW" 并不是一个像 Scikit-learn、TensorFlow 或 PyTorch 那样广为人知的通用框架或算法…

18、决策树与集成学习 - 从单一智慧到群体决策

学习目标:理解决策树的构建原理和分裂标准,掌握信息增益、基尼系数等概念,学会决策树的剪枝方法,深入理解集成学习的思想,掌握随机森林和梯度提升的基本原理。 > 从第17章到第18章:从概率模型到规则模型 在第17章中,我们学习了逻辑回归——一个基于概率的线性分类器…

王道计算机组成原理 学习笔记

第一章计算机系统概述1.1计算机的发展历程1.2计算机系统层次结构1.2.11.2.2 计算机硬件的基本组成1.2.2 各个硬件的工作原理1.2.3 计算机软件1.2.4 计算机系统的层次结1.2.5 计算机系统的工作原理1.3计算机的性能指标第二章数据的表示和运算第三章存储系统第四章指令系统第五章…