Redis哈希对象(listpack介绍)

        哈希对象的编码可以是ziplist或者hashtable。再redis5.0版本之后出现listpack,为了是代替ziplist。

一. 使用ziplist编码

        ziplist编码的哈希对象使用压缩列表作为底层实现,每当有新的键值对要加入到哈希对象时,程序都会先将保存了键值对的键的压缩列表节点推入到压缩列表表尾,再将保存了值的压缩列表节点推入到压缩列表表尾。

  • 保存了同一键值对的两个节点总是紧挨在一起的,保存键的节点在前,保存值的节点在后。
  • 先添加到哈希对象中的键值对会被放到压缩列表头方向,而后来添加到哈希对象中的键值对会被放在压缩列表的表尾方向。
127.0.0.1:6379> hset profile name "tom"
(integer) 1
127.0.0.1:6379> hset profile age 25
(integer) 1
127.0.0.1:6379> hset profile career "Programmer"
(integer) 1
127.0.0.1:6379> 

        如果Redis使用ziplist作为哈希对象的的编码,那么对象和对象使用的压缩列表会如下图:

二.使用hashtable编码

        当使用hashtable编码的作为哈希对象的编码,是使用字典作为底层实现,哈希对象的每一个键值对都使用一个字典键值对来保存。

//字典节点结构
typedef struct dictEntry {//键void *key;//值union {void *val;uint64_t u64;int64_t s64;double d;} v;//指向下一个节点,形成链表struct dictEntry *next;
} dictEntry;
  • 字典每一个键都是一个字符串对象,对象中保存了键值对的键
  • 字典每一个值都是一个字符串对象,对象中保存了键值对的值

举个例子,如果前面的profile键创建的不是ziplist编码的哈希对象,而是hashtable编码的哈希对象,那么这个哈希对象结构如下图:

三. 编码转换

         当哈希对象可以同时满足以下两个条件时,哈希对象使用ziplist编码:

  • 哈希对象保存的所有的键和值的字符串长度都小于64字节
  • 哈希对象保存的键值对数量小于512个,不能满足这个条件的哈希对象需要使用hashtable编码。

四.哈希命令的实现

五. listpack编码

        5.1 介绍

         listpack(紧凑列表)时Redis5版本出现的,作用是为了代替ziplist。Redis7.0版本之后,listpack就完全替代了ziplist。

        ziplist的缺点是,在极端的情况下,可能会出现连锁更新的情况,时间复杂度是O(N^2),会带来不小的性能消耗。ziplist介绍:Redis压缩列表-CSDN博客

        虽然Redis在3.0版本后使用quicklist,通过quicklistNode来控制ziplist的大小和元素的个数,减少连锁更新带来的性能问题,但是它并没有避免连锁更新,使用的还是ziplist。

        而listpack最大的特点是,每一个节点不再包含前一个节点的长度,而压缩列表正是因为节点中包含前一个节点的长度,所以存在连锁更新的隐患。

typedef struct {/* 当使用string时,它具有长度(slen)。 */unsigned char *sval;uint32_t slen;/* 当使用integer时,“sval”为 NULL,lval 保存该值。*/long long lval;
} listpackEntry;

        listpackEntry中的slen属性记录的是当前节点的长度,而非前一个节点的长度。并且listpackEntry可以保存整数或者字符串。

  • 当存储整数时,lval就是对应的整数值,sval为NULL,slen为0。
  • 当存储字符串时,sval保存的时字符串的值,slen保存字符串的长度。

        5.2 结构

        通过创建一个listpack函数我们可以得到listpack的结构:
 

unsigned char *lpNew(size_t capacity) {unsigned char *lp = lp_malloc(capacity > LP_HDR_SIZE+1 ? capacity : LP_HDR_SIZE+1);if (lp == NULL) return NULL;lpSetTotalBytes(lp,LP_HDR_SIZE+1);lpSetNumElements(lp,0);lp[LP_HDR_SIZE] = LP_EOF;return lp;
}

        结构为:

  • encoding:编码,会对不同长度的整形和字符串进行编码
  • data: 数据
  • len:当前节点的长度。 

        5.3 与ziplist的区别

  1. listpack节点不包含前一个节点的长度,避免了连锁更新问题
  2. listpack结构没有指向末尾节点地址的偏移量,解决ziplist内存长度限制的问题,但是一个listpack最大内存使用不能超过1G。

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

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

相关文章

【Linux 静态IP配置】

静态IP配置 1.NAT模式设置2.设置静态ip3.重启网络4.查看ip 1.NAT模式设置 首先设置虚拟机中NAT模式的选项,打开VMware,点击“编辑”下的“虚拟网络编辑器”,设置NAT参数 注意: VMware Network Adapter VMnet8保证是启用状态 …

ClassCMS2.4漏洞复现

ClassCMS2.4漏洞复现 环境搭建 任意文件下载漏洞复现 漏洞成因 ClassCMS2.4漏洞复现 CMS源码在附件中 环境搭建 使用phpstudy2016搭建web环境,php版本为5.5 安装CMS 这里选择Mysql数据库进行安装 用户名和密码都写默认的admin方便记忆 输入完成后点击安装 点…

【性能测试】性能测试监控关键指标

系统指标 检测性能测试是否有bug的关键指标 1、系统指标——与用户场景及需求直接相关。 并发用户数:某一物理时刻同时向系统提交请求的用户数。平均响应时间:系统处理事务的响应时间的平均值,对于系统快速响应类页面,一般响应…

货代FOB条款卖方必备的知识:发货人都要承担哪些费用呢?

据统计,中国出口中以FOB成交的占到70%,但专家指出:FOB对出口商的风险更大,有可能造成货、款两空的结局。 目前我国出口合同以FOB价格条款成交的比例越来越大,而且收货人指定船公司的少,指定境外货代的多&am…

koa2项目jwt结合jsonwebtoken进行加密和验签

1.创建项目 koa-generator快速生成koa项目 koa2 admin-server npm install -g koa-generator koa2 admin-server npm install npm run dev启动服务 2.token设置 app.js引入koa-jwt和jsonwebtoken npm i koa-jwt npm i jsonwebtoken 引入路由文件;对没有验签通…

阻止事件冒泡

在默认情况下,发生在一个子元素上的单击事件(或者其他事件),如果在其父级元素绑定了一个同样的事件,此时点击子元素,click事件会首先被子元素捕获,执行绑定的事件程序,之后会被父级元…

建设银行新余市分行积极开展国债下乡宣传活动

近日,为了普及国债知识,提高农村居民对国债的认知度和投资意识,建设银行新余市分行组织员工前往下村开展了一场国债下乡宣传活动。 活动当天,工作人员早早地来到了下乡地点,悬挂起了国债宣传横幅,并摆放了…

ESP32-Web-Server编程- 使用SSE 实时更新设备信息

ESP32-Web-Server编程- 使用SSE 实时更新设备信息 概述 如前所述,传统 HTTP 通信协议基于 Request-Apply(请求-响应)机制,浏览器(客户端)只能单向地向服务器发起请求,服务器无法主动向浏览器推…

1.7 java实现License认证信息的加密解密处理

java实现License认证信息的加密解密处理 一、什么是License认证二、确定License文件的格式和内容1. 生成一个存放License信息的ini文件 三、使用RSA非对称加密方式对文件进行加密和解密1. 生成密钥对2. 加密数据3. 解密数据 一、什么是License认证 License认证是一种用于验证软…

java源码-数组

背景 上传图片,需要对图片格式进行校验,这是就可以使用数组 1、什么是数组? Java 语言中提供的数组是用来存储固定大小的同类型元素。 如:可以声明一个数组变量,如 numbers[100] 来代替直接声明 100 个独立变量 numb…

替代升级虚拟化 | ZStack Cloud云平台助力中节能镇江公司核心业务上云

数字经济正加速推动各行各业的高质量升级发展,云计算是数字经济的核心底层基础设施。作为云基础软件企业,云轴科技ZStack 坚持自主创新,自研架构,产品矩阵可全面覆盖数据中心云基础设施,针对虚拟化资源实现纳管、替代和…

用按层次顺序遍历二叉树的方法,设计算法统计树中度为1的结点数目

用按层次顺序遍历二叉树的方法,设计算法统计树中度为1的结点数目 代码思路: 层序遍历的实现需要借助一个辅助队列 首先将根结点入队,然后根出队,把根的两个子树入队 然后下面循环执行:队头元素出队,队头元…

如何通过降低设备六大损失帮助企业改善OEE

在各个行业中,改善设备综合效率OEE(Overall Equipment Efficiency)是企业实现高效生产和竞争优势的关键。然而,设备的六大损失常常影响着企业的OEE指标。本文将探讨如何通过降低这六大损失来帮助企业改善OEE,提高生产效…

2023年掌控安全学院CTF暖冬杯——数据流分析

前言:打工仔一枚,第一波上新的3题misc 做完了 再打ISCTF随便记录一下 PS:环境关了,题目描述忘记了,反正就是找flag。 筛选HTTP数据流 导出数据流慢慢看 ctrl F 搜flag 看到一条 有flag.txt 的数据 导出另存.zip 这里…

洗袜子的洗衣机哪款好?内衣洗衣机便宜好用的牌子

不得不说洗衣机的发明解放了我们的双手,而我们从小到大就有这个意识,贴身衣物不可以和普通的衣服一起丢进去洗衣机一起,而内衣裤上不仅有肉眼看见的污渍还有手上根本无法消灭的细菌,但是有一款专门可以将衣物上的细菌杀除的内衣洗…

java设计模式学习之【建造者模式】

文章目录 引言建造者模式简介定义与用途实现方式: 使用场景优势与劣势建造者模式在spring中的应用CD(光盘)的模拟示例UML 订单系统的模拟示例UML 代码地址 引言 建造者模式在创建复杂对象时展现出其强大的能力,特别是当这些对象需…

Java8特性总结

1、函数式编程 1.1 作用&#xff1a;简化、延迟执行 1.2 常用函数式编程类型 Supplier<T>:get() 生产者类型&#xff0c;返回指定T类型的数据&#xff0c;无入参Consumer<T>:accept(T) 消费者类型&#xff0c;传入T类型&#xff0c;进行消费&#xff0c;无返回值…

docker集群的详解以及超详细搭建

文章目录 一、问题引入1. 多容器位于同一主机2. 多容器位于不同主机 二、介绍三、特性四、概念1. 节点nodes2. 服务(service)和任务(task)3. 负载均衡 五、docker网络1. overlay网络 六、docker集群搭建1. 环境介绍2. 创建集群3. 集群网络4. 加入工作节点 七、部署可视化界面po…

Android 13.0 Launcher3 禁止首屏时钟部件拖动到其他屏

1.概述 在13.0的系统rom定制化开发中, 在系统Launcher3中,首页中间默认有个时钟部件来显示时间,并且可以任意拖拽到其他地方,如果拖动到其他屏显的很不美观,所以根据需要要求时钟部件 不能拖拽到其他屏,所以就要从拖拽开始处理,判断如果是时钟部件,就不让拖拽到其他屏,…

数学建模-基于脑出血患者院前指标的多种机器学习预测模型构建及比较研究

基基于脑出血患者院前指标的多种机器学习预测模型构建及比较研究 整体求解过程概述(摘要) 卒中是全球致残率、致死率最高的疾病之一&#xff0c;其中脑出血&#xff08;Intracerebral hemorrhage&#xff0c;ICH&#xff09;患者仅占卒中患者的 20%&#xff0c;但致残、死亡人…