Redis6 数据结构Hash

news2024/9/21 10:53:33

前言

在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.coloradmin.cn/o/594575.html

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

相关文章

深度学习进阶篇[7]:Transformer模型长输入序列、广义注意力、FAVOR+快速注意力、蛋白质序列建模实操。

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

MP3 Module 语音播放模块(Arduino和串口控制)

MP3 Module 语音播放模块&#xff08;Arduino和串口控制&#xff09; 前言电气参数原理图MP3文件所放位置和命名规则&#xff1a;接线代码串口控制通讯指令&#xff08;部分&#xff09;实验结果 前言 Emakefun MP3语音模块内置8 MB存储空间&#xff0c;无需外接SD卡&#xff…

acwing提高——迭代加深+双向dfs+IDA*

1.迭代加深 顾名思义说明迭代的层数逐渐加深&#xff0c;这样做法有点像bfs的做法层层突出&#xff0c;符合的题型是答案在层数较低的那一层里 加成序列 题目https://www.acwing.com/problem/content/description/172/ #include<bits/stdc.h> using namespace std; c…

接口测试系列之 —— 前端交互测试和后端逻辑测试

01 前端交互测试 前端页面与后端代码之间的交互测试&#xff0c;可以理解为接口功能测试的一个子集。 测试准备 在进行交互测试前&#xff0c;首先要对前端功能有明确的认知&#xff0c;能够明确区分&#xff1a; 什么功能属于前端页面逻辑功能 什么功能又属于前端与后端…

路径规划算法:基于树种优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于树种优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于树种优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法树种…

JMeter快速入门指南:轻松掌握基本操作

Jmeter 介绍 Jmeter 是一款使用Java开发的&#xff0c;开源免费的&#xff0c;测试工具&#xff0c; 主要用来做功能测试和性能测试&#xff08;压力测试/负载测试&#xff09;. 而且用Jmeter 来测试 Restful API, 非常好用。 2023Jmeter性能测试项目实战教程&#xff0c;十…

ffmpeg下载及ffmpy3安装使用

ffmpeg下载及ffmpy3安装使用 1.下载ffmpeg 进入网址&#xff1a;https://www.gyan.dev/ffmpeg/builds/ 在release builds中下载ffmpeg-release-full.7z 下载好后解压到自己想存放的目录&#xff0c;例如&#xff1a;D:\Tool\ffmpeg-6.0-full_build 2.配置环境变量 右键此电…

《最新出炉》Python+Playwright自动化测试-1-环境准备与搭建

一.简介 有很多人问能不能介绍一下Playwright这款自动化神器的相关知识&#xff0c;现在网上的资料太少了。其实在各大博客和公众号也看到过其相关的介绍和讲解。要不就是不全面、不系统&#xff0c;要不就是系统全面但是人家是收费的。当然了接下来也可能介绍的不全面或者不系…

什么是压力测试?什么是负载测试?这两个区别是什么?

前言 之前给一个客户做项目时&#xff0c;由于自己对性能测试了解并不深&#xff0c;搞不懂压力测试和负载测试的区别&#xff0c;导致后面还是由负责性能测试的同事来处理&#xff0c;他跟我说了很多关于压力测试和负载测试的区别&#xff0c;现在我总结如下。 压力测试 压…

解决node上传文件乱码问题终极方案

问题描述 今天在菜鸟教程学习node上传文件时遇到了一个中文乱码的问题&#xff0c;文件名包含中文就会显示乱码&#xff0c;上传到服务器的文件名也是乱码。试了两个方法都不行&#xff0c;最后还是问了万能的度娘才解决。 我做了一个非常简单的上传文件的界面&#xff0c; …

Java SE(十二)之多线程

文章目录 概述1.进程&线程2.并行&并发 线程创建方式1.第一种&#xff1a;继承Thread类2.第二种&#xff1a;实现Runnable接口3.Callable、FutureTask接口4.线程创建的三种方式对比 Thread常用方法1.构造器2.设置和获取线程名称3.线程调度4.线程控制5.线程生命周期 线程…

静态路由和默认路由的工作原理

目录 静态路由 静态路由配置 默认&#xff08;缺省&#xff09;路由 路由的高级特性 1&#xff0c;递归路由 2&#xff0c;等价路由 3&#xff0c;浮动路由 4&#xff0c;路由汇总 环路问题&#xff1a; 解决方法&#xff1a; 静态路由 在路由器手动添加路由条目 静…

基于深度学习的高精度浣熊检测识别系统(PyTorch+Pyside6+模型)

摘要&#xff1a;基于深度学习的高精度浣熊检测&#xff08;水牛、犀牛、斑马和大象&#xff09;识别系统可用于日常生活中或野外来检测与定位浣熊目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的浣熊目标检测识别&#xff0c;另外支持结果可视化与图片或视…

Spring Boot 集成支付宝、微信等支付平台API

Spring Boot 集成支付宝、微信等支付平台API 在现代的 Web 应用程序开发中&#xff0c;与第三方 API 的集成是非常常见的需求。例如&#xff0c;支付宝、微信等支付平台的支付接口、短信验证码的发送接口、邮件发送接口等。Spring Boot 提供了许多便捷的方式来集成这些第三方 …

Python实战基础17-包

1、pip的安装配置 1.1 pip命令的使用 在安装python时&#xff0c;同时还会安装pip软件&#xff0c;它是python的包管理工具&#xff0c;可以用来查找、下载、安装和卸载python的第三方资源包。 1.2 配置pip 可以直接在终端输入pip命令&#xff0c;如果出错可能会有两个原因…

接口自动化测试实战:JMeter+Ant+Jenkins+钉钉机器人群通知完美结合

目录 前言 一、本地JAVA环境安装配置&#xff0c;安装JAVA8和JAVA17 二、安装和配置Jmeter 三、安装和配置ant 四、jmeter ant配置 五、jenkins安装和配置持续构建项目 文末福利 前言 搭建jmeterantjenkins环境有些前提条件&#xff0c;那就是要先配置好java环境&#…

OS-内存管理-4种内存管理方式(连续分配,页式,段式,段页)。

一&#xff0c;内存管理四种方式。 二&#xff0c;连续分配管理方式。 连续分配方式&#xff1a;为用户分配连续的内存空间。 1.单一连续分配方式 2.固定分区分配方式 3.动态分区分配方式 4.三种连续分配方式的对比。 三&#xff0c;基于页式存储管理。 1.页式 为进一步提高…

【来不及刷题之】32、二分搜索(寻找数,寻找左右边界)

1. 基础二分搜索&#xff1a;寻找一个数 一道很基础的题目&#xff0c;主要注意一下循环条件是 left<right 即可 class Solution {public int search(int[] nums, int target) {int left0;int rightnums.length-1;while(left<right){int midleft(right-left)/2;if(nums…

第二十一章行为性模式—访问者模式

文章目录 访问者模式解决的问题结构实例存在的问题使用场景 拓展动态分派静态分派双分派 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。行为型模…

华为OD机试真题B卷 Java 实现【箱子之形摆放】,附详细解题思路

一、题目描述 要求将一批箱子按从上到下以‘之’字形的顺序摆放在宽度为 n 的空地上&#xff0c;输出箱子的摆放位置&#xff0c;例如&#xff1a;箱子ABCDEFG&#xff0c;空地宽为3。 摆放效果如下图&#xff1a; 则输出结果为&#xff1a; AFG BE CD 二、输入描述 一行…