Redis6 数据结构Hash

news/2025/3/15 16:31:04/

前言

在Redis中,hashtable 被称为字典(dictionary),它是一个数组+链表到结构。每个键值对都会有一个dictEntry

OBJ_ENCODING_HT
这种编码夯实内部才是真正的哈希表结构,或称为字典结构,其可以实现O(1)复杂度的读写操作,因此效率很高。
在Redis内部。从OBJ_ENCODING_HT:
在这里插入图片描述

编码格式

redis6

ziplist
hashtable

ziplist

ziplist 压缩列表是一种紧凑编码格式,总体思想是花时间来(压缩,解压)获取节约空间,即以部分读写性能为代价,来换取极高的内存空间利用率,因此只会用于字段个素少,且字段值也比较小的场景。压缩类标内存利用率极高的原因与其连续内存的特性是分不开的。

ziplist为了节约内存开发的,他是由连续内存卡组成的顺序型数据结构,优点类似于数组。
zi plist是一个特殊编码的双向链表,他不存储指向前一个链表节点prev和执行下一个链表节点的指针next.
而是存储上一个节点长度和当前节点长度。通过牺牲部分读写性能,来换取高效的内存空间利用率,节约内存,是一种时间换空间的思想。

在这里插入图片描述
在这里插入图片描述

zplist 中 的zlentry

对比java hashMap中 Map.entry<K,V>
static class Node<K,v> implements Map.entry<K,V>{
final K key;
V value;
Node<K,V> next;
}
而 zap中是zlEntry
在这里插入图片描述

zipList 的存取

zlentry 属性解析

压缩列表zlentry 节点结构: 每个zlenrty由前一个节点的长度,encoding和entry-data三部分组成
在这里插入图片描述
前节点: (前节点占用的内存字节数)表示前1个zlentry的长度,privious_entry_lengthy有两种取值情况: 1字节和5字节。取值1字节时,表示上一个entry的长度小于254字节。虽然1字节的值能表示0到255,但是压缩列表中zlend到的取值默认时255,因此就默认使用255表示整个压缩列表的结束,其他表示疮毒的地方就不能使用255这个值了。所以上一个长度小于等于254字节时,pre_len取值为1字节,否则为5字节。记录长度的好处:暂用内存小,1或者5个字节

encoding:记录节点的context保存的类型和context的长度

在这里插入图片描述

zlentry 为什么要这么设计?

在这里插入图片描述

privious_entry_length,encoding长度都可以根据编码方式推算,正在变化的是context,而context长度记录在encoding里,因此entry的长度就知道了
entry的总长度= privious_entry_length字节数+encoding字节数+context字节数。

链表在内存中,一般是不连续的,遍历相对比较慢,而zipList可以很好的解决这个问题。如果知道当前的起始地址,因为entry是连续的,entry后一定是另一个entry,想知道下一个entry的地址,只要将当前的起始地址加上当前entry的总长度。如果还想知道下一个enrty,则继续上一步的操作。

在这里插入图片描述

在这里插入图片描述

结构

hash-max-ziplist-entries: 使用压缩列表保存时哈希集合中的最大元素个数
hash-max-ziplist-value: 使用压缩列表保存时哈希集合中单个元素的最大长度。

结论

1.哈希对象保存的键值对数量小于512个;
2.所有的键值对的键和值的字符串长度都小于等于64byte(一个英文字符一个字节,一个数字一个字节)
3. ziplist 升级到hash table 可以,hashtable变为ziplist不可用,在节省内存空间方面hashtable没有zi plist高效
在这里插入图片描述


http://www.ppmy.cn/news/124678.html

相关文章

Spring Boot如何实现自定义条件注解

Spring Boot如何实现自定义条件注解 在Spring Boot中&#xff0c;条件注解是一种非常强大的工具&#xff0c;它可以根据特定的条件来选择是否加载某个类或某个Bean。Spring Boot已经提供了一些内置的条件注解&#xff0c;例如ConditionalOnClass、ConditionalOnBean等&#xf…

踩坑笔记 ---- 使用LocalDateTime开通会员到期时间与自动续费业务某天用户突然为0

写在前面 使用LocalDateTime的同学需要注意下&#xff0c;这东西的plusMonth可能会有点点超出你的认知&#xff0c;如果不慎掉坑里&#xff0c;希望这篇笔记可以给你提供思路 业务背景 此业务场景非常简单&#xff0c;自动续费业务&#xff0c;需要在用户会员到期前24小时执…

2021-10-20制氧机解决方案

制氧机的特点是吸氧直接提高使用人动脉血氧含量&#xff0c;而不是作用于机体某个部分间接改善缺氧&#xff0c;只是在增加机体有生以来一直不断摄入的氧气。没有对于机体陌生的、需要适应的、需要解析的物质&#xff0c;因而只是改善而不是改变机体的自然生理状态和生物化学环…

解锁数据魔法:探索Java 8中Stream的奇妙世界

Java 8引入了一个强大的功能&#xff0c;即Stream API。Stream API允许我们以一种更简洁和功能强大的方式处理集合数据。在本文中&#xff0c;我将介绍Java 8中Stream的用法&#xff0c;并提供一些实例来说明其如何简化和改进我们的代码。 一、什么是Stream&#xff1f; Stre…

2021-10-22制氧机控制板开发吸氧机方案

家用智能制氧机工作原理&#xff1a;利用分子筛物理吸附和解吸技术.制氧机内装填分子筛&#xff0c;在加压时可将空气中氮气吸附&#xff0c;剩余的未被吸收的氧气被收集起来&#xff0c;经过净化处理后即成为高纯度的氧气。分子筛在减压时将所吸附的氮气排放回环境空气中&…

制氧机

制氧机是一种制造氧气的设备。它通常通过将空气中的氧分离出来来制造氧气。制氧机通常用于医院、工业生产和家庭使用。它们的工作原理是将空气进行净化和过滤&#xff0c;然后通过分离氧气制造出纯净的氧气。制氧机有很多不同的型号和规格&#xff0c;可以满足不同的使用需求。…

光纤融拉机(拉锥机)

1.功能&#xff1a;将光纤间的内芯&#xff0c;通过烧的方式&#xff08;也有其它的方式&#xff09;融合在一起&#xff0c;主要实现光的分路&#xff0c;同时有高低功率的光纤。 2.硬件&#xff1a;运行控制器或卡或自己DIY芯片&#xff0c;电机&#xff0c;数据采集卡&…

计算机音乐如何复制到手机桌面,电脑上的歌怎么传到手机上

随着人们生活水平的提高&#xff0c;每个人的手中都有一部手机&#xff0c;手机已成为人们日常生活中所需品之一。那么电脑上的歌怎么传到手机上呢?今天学习啦小编与大家分享下电脑上的歌怎么传到手机上的解决方法&#xff0c;有兴趣的朋友不妨了解下。 电脑上的歌传到手机上 …