【Redis】深入理解 Redis 常用数据类型源码及底层实现(4.详解Hash数据结构)

news2024/12/27 13:10:02

Hash数据结构

看过前面的介绍,大家应该知道 Redis 的 Hash 结构的底层实现在 6 和 7 是不同的,Redis 6 是 ziplist 和 hashtable,Redis 7 是 listpack 和 hashtable。

我们先使用config get hash*看下 Redis 6 和 Redis 7 的 Hash 结构配置情况(在Redis客户端的命令行界面中使用INFO server可以查看包括版本号等各个信息)

通过Docker拉取一个Redis7的镜像,同样的命令查看相关信息

可以看到Redis7多了hash-max-listpack-entries和hash-max-listpack-value两项,我们先介绍下这四个参数的含义:

  • hash-max-ziplist-entries:使用压缩列表保存数据时,哈希集合中最大的元素个数
  • hash-max-ziplist-value:使用压缩列表保存数据时,哈希集合中单个元素的最大长度
    • 单位byte:一个英文字母一个byte
  • hash-max-listpack-entries:使用紧凑列表保存数据时,哈希集合中最大的元素个数
  • hash-max-listpack-value:使用紧凑列表保存数据时,哈希集合中单个元素的最大长度

上面两张图中的参数都是默认情况,为了方便测试效果我们把这两个值都改小些(如下图)

依次存储不同长度的值,并查看编码方式

有上面两张图可以看到,当同时满足字段个数小于hash-max-ziplist-entries并且字段值都小于hash-max-ziplist-value时,才会使用OBJ_ENCODING_ZIPLIST的编码方式进行存储,二者不满足任意一个就会转换为OBJ_ENCODING_HT的编码方式进行存储,并且不可逆(OBJ_ENCODING_ZIPLIST变成OBJ_ENCODING_HT可以,但是即便存储的数据又满足了上面提到的两个要求,OBJ_ENCODING_HT也不会再变回OBJ_ENCODING_ZIPLIST(反反复复浪费性能),相比较OBJ_ENCODING_HT,OBJ_ENCODING_ZIPLIST会更节省内存空间)。

源码分析

t_hash.c

hashtable在Redis中被称为“字典”,他是一个数组+链表的结构

OBJ_ENCODING_HT这种编码方式内部才是真正的哈希表结构,或称为字典结构,有一个dictEntry,详见下图源代码:

OBJ_ENCODING_HT这种编码方式内部才是真正的哈希结构(或称为字典结构),其可以实现O(1)的时间复杂度的读写操作,因此效率很高,在Redis内部,从OBJ_ENCODING_HT类型到底层真正的散列表数据结构是一层一层嵌套起来的,组织关系如

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

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

相关文章

2-21算法习题总结

由于蓝桥杯的题,我不知道从怎么复制,就只能粘贴图片了 翻硬币 代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String start sc.next();char[] starts start.toCharArray();String end sc…

Redis面试题及核心知识点讲解

redis是单线程还是多线程? redis是单线程的,主要是指网络I/O线程。Redis的持久化,集群同步等操作,则由另外的线程来执行。 2 . redis是单线程,为什么处理这么快? Redis的大部分操作都是在内存中完成。单线…

选择VR全景行业,需要了解哪些内容?

近年来,随着虚拟现实、增强现实等技术的持续发展,VR全景消费市场得以稳步扩张。其次,元宇宙行业的高速发展,也在进一步拉动VR全景技术的持续进步,带动VR产业的高质量发展。作为一种战略性的新兴产业,国家和…

一分钟学会MobaXterm当Linux客户端使用

一、介绍 MobaXterm是一款功能强大的远程计算机管理工具,它集成了各种网络工具和远程连接协议,可以帮助用户在Windows系统上轻松管理远程计算机。MobaXterm支持SSH、Telnet、RDP、VNC等多种远程连接协议,同时还集成了X11服务器,可…

react hook使用UEditor引入秀米图文排版

里面坑比较多,细节也比较多 以下使用的是react 18 ice3.0,使用其他react脚手架的配置基本相同,例如umi4 1.下载UEditor 进入UEditor仓库,找到版本v1.4.3.3,点击进去 接着下载ueditor1_4_3_3-utf8-jsp.zip版本 下载好…

iMazing2024Windows和Mac的iOS设备管理软件(可以替代iTunes进行数据备份和管理)

iMazing2024是一款兼容 Windows 和 Mac 的 iOS 设备管理软件,可以替代 iTunes 进行数据备份和管理。以下是一些 iMazing 的主要功能和优点: 数据备份和恢复:iMazing 提供了强大的数据备份和恢复功能,可以备份 iOS 设备上的各种数据…

精品基于jsp+SSM实现的仓储物流管理系统-驿站快递登记取件

《[含文档PPT源码等]精品基于jspSSM实现的仓储物流管理系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 使用技术: 开发语言:Java 框架:ssm 技术:JSP JDK版…

使用 package.json 配置代理解决 React 项目中的跨域请求问题

使用 package.json 配置代理解决 React 项目中的跨域请求问题 当我们在开发前端应用时,经常会遇到跨域请求的问题。为了解决这个问题,我们可以通过配置代理来实现在开发环境中向后端服务器发送请求。 在 React 项目中,我们可以使用 package…

MyBatis-Plus:通用分页实体封装

分页查询实体:PageQuery package com.example.demo.demos.model.query;import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.Data; import org.springframework.util.St…

linux 系统的目录结构

为什么某些执行程序位于/bin、/sbin、/usr/bin或/usr/sbin目录下?例如,less命令位于/usr/bin目录下。为什么不是/bin、/sbin或/usr/sbin?这些目录之间有什么区别呢? 在这篇文章中,让我们主要讲述一下Linux文件系统结构…

css实现梯形

<div class"trapezoid"></div> .trapezoid {width: 200px;height: 0;border-bottom: 100px solid red; /* 定义梯形的底边 */border-left: 50px solid transparent; /* 定义梯形的左边 */border-right: 50px solid transparent; /* 定义梯形的右边 */} …

【测试】----JMeter性能测试工具入门篇

定义&#xff08;主要测试的是接口&#xff09; JMeter是Apache组织使用Java开发的一款测试工具&#xff0c;可以对服务器&#xff0c;网络或者对象模拟巨大的负载情况&#xff1b;通过创建带有断言的脚本来验证程序是否能返回期望的结果 优缺点 优点 开源免费跨平台&#xff0…

Sui基金会与沙迦美国大学宣布合作开设区块链学院

沙迦美国大学&#xff08;American University of Sharjah&#xff0c;AUS&#xff09;作为中东领先的创新中心&#xff0c;与Sui合作推出了一个新的区块链研究中心&#xff0c;进一步提升了其在创新领域的声誉。 该举措是沙迦酋长国旨在将自己定位为教育和研究区域中心的一部…

imazing是什么软件?2024最新版本有哪些功能

iMazing的其他功能包括&#xff1a; iOS信息查询&#xff1a;在iMazing中&#xff0c;用户可以查询到关于iOS设备的所有信息&#xff0c;包括设备型号、系统版本、存储容量、电池状态等&#xff0c;还能将这些设备的信息进行导出&#xff0c;方便用户随时了解自己的设备状态。…

微信小程序uniapp+vue校园任务跑腿接单平台java+python+nodejs+php

对于校园跑腿系统功能所牵扯的数据都是通过用户进行校园跑腿系统等相关的数据信息内容、并且可以进行管理员服务端&#xff1b;首页、个人中心、学生管理、跑腿者管理、系统公告管理、在线下单管理、已完成订单管理、订单评价管理、已接订单管理、系统管理&#xff0c;跑腿者客…

第六篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:深度解读Kaldi库个性化定制语音搜索引擎

传奇开心果短博文系列 系列短博文目录Python文本和语音相互转换库技术点案例示例系列 短博文目录前言一、雏形示例代码二、扩展思路介绍三、数据准备示例代码四、特征提取示例代码五、声学模型训练示例代码六、语言模型训练示例代码七、解码示例代码八、评估和调优示例代码九、…

LINUX读取RTC实时时钟时间

linux 读写RTC时间_linux rtc 读写-CSDN博客

Kotlin 中 List 和 MutableList 的区别

List&#xff1a;通用的有序元素集合。此接口中的方法仅支持对列表的只读访问&#xff1b;MutableList&#xff1a;支持添加和删除元素的通用有序元素集合。通过 MultableList 接口支持读/写访问&#xff1b; List 的相关操作&#xff1a; MutableList 的相关操作&#xff1a;…

内网穿透的应用-如何本地部署Elasticsearch搜索分析引擎实现并发布公网远程访问

文章目录 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 Elasticsearch是一个基于Lucene库的分布式搜索和分析引擎&#xff0c;它提供了一个分布式、多…

解决NPE的三种方式

解决NPE的三种方式 NullPointerException&#xff08;空指针异常&#xff0c;NPE&#xff09;是Java编程中常见的错误。解决NPE的方法可以从以下三个方面考虑&#xff1a; 明确处理空引用情况&#xff1a; 在某些情况下&#xff0c;无法避免使用可能为空的引用对象。此时&…