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

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.hqwc.cn/news/475354.html

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

相关文章

vue框架-vue-cli

vue-cli Vue CLI是一个官方的脚手架工具,用于快速搭建基于Vue.js的项目。Vue CLI提供了一整套可配置的脚手架,可以帮助开发人员快速构建现代化的Web应用程序。 Vue CLI通过提供预先配置好的Webpack模板和插件,使得开发人员可以在不需要手动编写Webpack配置的情况下快速创建…

[Docker实战] 旭日X3派上Docker Openwrt +Samba 实现局域网NAS 开启AP模式

​ 🌈 博客个人主页:Chris在Coding 🎥 本文所属专栏:[旭日X3派] [Docker实战] ❤️ 前置学习专栏:[Linux学习] ⏰ 我们仍在旅途 …

milvus insert api的数据结构源码分析

insert api的数据结构 一个完整的insert例子: import numpy as np from pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )num_entities, dim 10, 3print("start connecting to Milvus") connections.connect("default&q…

CSS概述 | CSS的引入方式 | 选择器

文章目录 1.CSS概述2.CSS的引入方式2.1.内部样式表2.2.行内样式表2.3.外部样式表 3.选择器 1.CSS概述 CSS,全称Cascading Style Sheets(层叠样式表),是一种用来设置HTML(或XML等)文档样式的语言。CSS的主要…

全网超全的测试类型详解,再也不怕面试答不出来了!

在软件测试工作过程中或者在面试过程中经常会被问到一些看起来简单但是总是有些回答不上的问题,比如你说说“黑盒测试和白盒测试的区别?”,“你们公司做灰度测试么?", ”α测试和β测试有什么不一样?“&#xff0…

基于JAVA(springboot)后台微信外出务工人员信息管理小程序系统设计与实现

博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

python 基础知识点(蓝桥杯python科目个人复习计划44)

今日复习内容:做真题 复习动态规划 完全背包问题是背包问题的一个重要变体。 1.问题描述 给定一个背包,容量为C,一组物品,每个物品有自己的重量wi和价值vi,完全背包问题要求在不超过背包容量的情况下,放…

基于51/STM32单片机的智能药盒 物联网定时吃药 药品分类

功能介绍 以51/STM32单片机作为主控系统; LCD1602液晶显示当前时间、温湿度、药品重量 3次吃药时间、药品类目和药品数量 HX711压力采集当前药品重量 红外感应当前药盒是否打开 DS1302时钟芯片显示当前年月日、时分秒、星期 DHT11采集当前环境温度和湿度 …

反射的作用

获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑结合配置文件,动态的创建对象并调用方法 练习1: public class MyTest {public static void main(String[] args) throws IllegalAccessException, IOException {Stude…

SQL25 查找山东大学或者性别为男生的信息(union用法)

代码 select device_id , gender , age , gpa from user_profile where university 山东大学 UNION ALL select device_id , gender , age , gpa from user_profile where gender male知识点 在使用 Union 时,如果不需要删除重复行,或者结果集中的重…

EXCEL中不错的xlookup函数

excel中一般要经常用vlookup函数,但其实经常麻烦要正序,从左边到右边,还要数列,挺麻烦的,xlookup的函数还不错,有个不错的一套视频介绍,B站的,地址是:XLOOKUP函数基础用法&#xff0…

【OpenAI Sora】怎么启用:详细教程与使用指南(OpenAI Sora怎么启用)

OpenAI Sora的启用方法:详细教程与使用指南 OpenAI Sora是一种新的AI大模型,可以根据简单的文本提示生成逼真和富有想象力的60秒视频。用户可以通过以下步骤启用OpenAI Sora: 最新消息:本文是设想的方式,但 Sora 目前…