Redis数据结构listpack

news/2025/2/13 23:59:52/文章来源:https://www.cnblogs.com/lllbrblogs/p/18714620

一、前言
listpack压缩列表。作为ziplist的替代品,从2017年引入Redis后,到redis7.0已经完全取代ziplist
作为redis底层存储数据结构之一。
相对于ziplist,listpack内存更紧凑,实现更简洁。下面详细分析这一底层数据结构的实现原理。

二、实现原理
2.1 、内存结构
listpack 作为 ziplist 的替代者,它的内存布局、实现原理和listpack非常相似。比如:都是连续的一块内存,前端都有表示内存大小、元素个数;尾部都有终结标志等元数据。但是他们彼此之间又有差异。下面分别通过对比的方式,对listpack内存布局进行重点说明.

2.1.1、ziplist内存布局:
ziplist内存布局

2.2.2、listpack内存布局:
listpack内存布局

通过以上两个内存结构图,可以直观看出ziplist 内存结构比 listpack 稍微复杂。
彼此之间的差异如下:

相同点:
头部都用4个字节的无符号整数记录了使用内存的大小;
内存块尾部最后一个字节都用来表示列表的终结,而且内容都是0xFF;
列表元素(entry)都是根据不同的数据内容编码后存储,条目都包含了三部分内容:编码、长度、数据。
差异点:
结构组成不同:ziplist内存结构分了四个功能块:ziplist总长度,元素个数,最后元素的偏移和结尾标志;而listpack只有三个功能块:listpack总长度,元素个数和结尾标志,少了最后元素的偏移;
数据长度不同:两者的包含元素个数使用的字节长度不一样ziplist是4个字节的uint32_t类型数据,而listpack则是两个字节的unint16_t类型数据,单从这个数据的长度来看,listpack能存储的数据个数是比ziplist少的。因为uint16_t能容纳的数据比uint32_t要少。
两者元素结构不同:ziplist元素的三个组成部分分别是:前置元素(entry)的长度数据,本条目的编码方案(包含数据长度)和具体的数据内容;而listpack元素的三个组成部分则是:本条目的编码方案(包含数据长度)、具体的数据内容和本条目前面两个条目数据长度编码后需要的字节数。就是说ziplist条目保存了上一个条目的长度信息,而listpack则保存了自己的长度信息。这两者有很明显的区别,而且这个区别,将影响两者操作的完全不同。
下面将详细描述listpack的条目编码方案。

每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:返回到达 nums[n - 1] 的最小跳跃次数。

public int jump(int[] nums) {
int len = nums.length;
int steps = 0;
int end = 0;
int maxP = 0;
for(int i = 0;i < len-1; i++) {
maxP = Math.max(maxP, nums[i] + i);
if(end == i) {
steps++;
end = maxP;
}
}
return steps;
}
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

public int rob(int[] nums) {
if (nums == null || nums.length == 0) return 0;
if (nums.length == 1) return nums[0];
int res = 0;
int len = nums.length;
int[] dp = new int[len];
dp[0] = nums[0];
dp[1] = Math.max(nums[0], nums[1]);
for(int i = 2; i < len; i++) {
dp[i] = Math.max(dp[i-1], dp[i-2] + nums[i]);
}
return dp[len - 1];
}

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

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

相关文章

框架ThinkPHP

引子:本章主要介绍ThinkPHP(PHP开发框架)的简单使用和一些安全问题。免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!! 附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 1.5 🐘框架&a…

我的“DeepSeek服务不忙了”,腾讯云671B满血模型无限量调用攻略!

DeepSeek R1虽然免费,但是基本到了无法使用的状态。一两轮对话后,就开始服务忙了。好在这是一个开源模型,大量的第三方平台开始上线了。上一篇我们就讲过硅基流动。最近听闻腾讯云也上线了 DeepSeek-V3、DeepSeek-R1 满血版模型。而且可以免费不限量使用。具体规则如下: 添…

ACM寒假集训第五次专题任务

ACM寒假集训第五次专题任务 一、自然数的拆分问题 题目:解题思路: 使用了深度优先搜索,通过he判断何时输出,c标记长度控制输出,qs标记起始位置从小到大拆分。 AC代码: #include<iostream> using namespace std; int n,a[10],ans; void dfs(int he,int c,int qs) {i…

DeepSeekR1+Cherry Studio使用白嫖API和开源软件使用满血版模型!

使用Ollama本地运行,使用Ollama+ChatWise可视化运行,使用Ollama+ChatWise在Macbook Air M1 上运行。今天再来说一个方案。这个方案不是完全离线,但是模型能力会比离线的强。可以完全免费尝试,有几百到几千万的Token可以用。可以缓解DeepSeek R1官方服务繁忙无法使用的问题。…

DeepSeekR1 苹果macbook M1本地可视化运行!

过年了,就带了一台 macbook air 8g,DeepSeekR1的消息还是铺天盖地的来,我就想着在这台电脑上也装一个吧。经过简单的配置,最终也运行起来了,速度还可以。我这是首款M系列笔记本,也是现在最低配的 M 系列笔记本。这也就意味着所有M系列的苹果电脑都可以轻松运行DeepSeekR1…

11.A星寻路算法

14.A星寻路算法 题目 迷宫寻路需求,在一个迷宫游戏中,有一些怪物攻击主角,现在希望小怪物,能自动绕过迷宫中的障碍物,寻找到主角的所在。 思路 A星寻路算法(A*search algorithm),是一种用于寻找有效路径的算法。 简单的场景举例(简化问题),看一看A星寻路算法的工作过程。…

人間になりたい。

さよならはエモーション 僕は行く ずっと涙こらえ こらえ 忘れてたエモーション 僕は行く ずっと深い霧の 霧の向こうへ『……组建过,那就好。』 属于我的 Crychic,就在那个寒假啊。 或许更早些,始于一次英语单元测同时爆炸了的三个人,经过一次精彩地赶在元旦零点钟声前分解…

【THM】Security Principles(安全原则)-学习

了解安全三元组以及常见的安全模型和原则。本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/securityprinciples 本文相关内容:了解安全三元组以及常见的安全模型和原则。介绍 网络安全已成为一个流行词;每家公司都声称其网络产品或网络服务是安全的,但事实上…

小米 R3G 路由器刷机教程(Pandavan)

小米 R3G 路由器以其高性价比和稳定的性能备受用户青睐。然而,原厂固件的功能相对有限,难以满足高级用户的个性化需求。刷机不仅可以解锁路由器的潜能,还能通过第三方固件实现更丰富的功能,如 DNS 解析、KMS 服务器、USB 管理等。本文旨在为小米 R3G 路由器用户提供详细的刷…

windows知道服务器的内网IP地址如何查看服务器的计算机名称

windows知道服务器的内网IP地址如何查看服务器的计算机名称windows知道服务器的内网IP地址如何查看服务器的计算机名称 nbtstat百度百科 https://baike.baidu.com/item/nbtstat/7578115 windows在局域网内查看ip地址对应的计算机名或者根据计算机名查ip https://blog.csdn.net/…

C++ 使用MIDI库演奏《晴天》

那些在MIDI库里徘徊的十六分音符 终究没能拼成告白的主歌我把周杰伦的《晴天》写成C++的类在每个midiEvent里埋藏故事的小黄花调试器的断点比初恋更漫长而青春不过是一串未导出的cmake工程文件在堆栈溢出的夜晚终将明白有些旋律永远停在#pragma once的注释里有些人永远停在未定…