Redis学习——List的连锁更新如何解决?ListPack算法如何改变?

文章目录

    • 引言
    • 正文
      • List简介
      • 什么是连锁更新
      • ListPack解决连锁更新
    • 总结
    • 信息来源

引言

  • 之前Redis匆匆学过之后,再回过头看,发现之前写的解决连锁更新的里有太过牵强了,有很多矛盾的地方,今天这里好好深挖一下,解决这个问题!

正文

List简介

  • List是redis中的一种数据结构,用来存储简单的字符串列表
    • 特点
      • 按照插入顺序排序
      • 可以从头部或者尾部向List列表添加元素

底层编码方式
在这里插入图片描述

  • 3.2之前,使用ZIPLIST和LINKEDLIST
    • ZIPLIST:元素个数小于512,并且每一个字节都小于64字节
    • LINKEDLIST:不满足上述条件使用LINKEDLIST
  • 3.2之后,使用QUICKLISK
    • 实际上是链表和ziplist的结合
      在这里插入图片描述
  • 今天所解决的连锁更新的问题,主要是围绕ZipList展开的,所以下面详细介绍一下ZipList的相关内容

ZipList

  • 类似链表紧凑型数据结构,能够节约内存,并且访问性能很好。

    • 链表是存在prev和next前后指针进行遍历访问,ZipList是通过记录前一个数据的长度实现前序遍历
  • 具体结构见下图

    • zlbytes
      • 表示ziplist一共占了多少个字节
    • zltail
      • 表示当前尾节点,相对于头节点偏移了多少字节
      • 通过tail快速定位到尾节点
    • zllen
      • 表示有多少数据节点,也就是有多少entry
    • zlend
      • 一个特殊的节点,表示zipllist的结束
        在这里插入图片描述
  • Entry结构,具体见下述示意图

    • prevlen
      • 上一个节点的数据长度
        • 作用
          • 通过当前节点的首地址P - 上一个节点的数据长度len,来获取上一个节点的起始位置,实现逆袭遍历,具体见下图
        • 类型
          • 前一个节点的长度,小于254字节,prevlen占据一个字节
          • 前一个节点的长度,大于255字节,prevlen占据四个字节,
    • encoding
      • 表示当前节点编码类型,主要由两个内容构成,分别是 当前节点的数据类型 + 当前节点的长度
    • entry-data
      • 表示当前节点的实际数据

在这里插入图片描述
prev说明

  • 0000 0000 ~ 1111 1110
    • 表示前一个节点的长度是0到254个字节,占据一个字节
  • 1111 1110 ,4 * (0000 0000)
    • 4 * (0000 0000)四个字节表示上一个节点的大小

什么是连锁更新

这里出现连锁更新,也是因为prev的字段的原因,存在如下情况,假设每一个节点大小都是253,然后第一个改了,后面都得改,具体见下图

  • 相当于第一次修改节点之后,需要所有节点都后移,然后再修改第二个节点的长度,后续所有节点有都需要向后移动,时间复杂度是n的平方
    在这里插入图片描述

ListPack解决连锁更新

  • 出现连锁更新的原因是因为prev是记录上一个节点长度,节点与节点之间是相互依赖的,现在为了解决节点之间的相互依赖性,让每一个节点仅仅记录自己的信息,所以采用ListPack算法,具体如下

在这里插入图片描述

  • 通过替换,每一个entry仅仅记录当前entry的长度,这样修改某一个entry,仅仅只需要修改当前entry的值,其他并不需要修改

在这里插入图片描述

总结

  • 之前就一直有疑惑,觉得并不能完全解决这个问题,因为将数据移动和连锁更新弄混了,对于这种紧凑结构而言,只要修改某一个数据,一定会发生数据移动的,但是连锁更新就不一定了!连锁更新是指更改一次数据,发生了多次完整的数据移动!
  • 继续加油吧!

信息来源

  • 一文回顾Redis五大对象
  • 技术文章摘抄

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LED会议一体机开启超微小间距COB高清显示在会议系统中的新乐章

在当今数字化、信息化高速发展的时代,会议系统作为企业沟通、决策的重要平台,其显示技术的革新正以前所未有的速度推动着会议体验的飞跃。LED会议一体机,作为这一领域的佼佼者,特别是当其融合了超微小间距COB(Chip On …

springboot项目实现分库

本文是根据仓库编码 和 仓库id进行按仓库进行分库处理,可以根据例子自行按照业务需要进行分库 1.核心是实现 Spring 的 AbstractRoutingDataSource 抽象类,重写 determineCurrentLookupKey 方法,实现动态数据源的目的 Slf4j public class D…

铁威马秋季新品即将上线,你想要的NAS我都有!

各位铁粉们,注意啦! 一场关于存储的饕餮盛宴即将拉开帷幕 铁威马,带着九款全新力作NAS 将于9月19日席卷全球市场 是的,你没听错 九款! 从入门级到专业级 从桌面型到机架式 全系搭载TOS 6 总有一款能击中你的心…

如何利用大数据与AI技术革新相亲交友体验

在数字化时代,大数据和人工智能(AI)技术正逐渐革新相亲交友体验,为寻找爱情的过程带来前所未有的变革(编辑h17711347205)。通过精准分析和智能匹配,这些技术能够极大地提高相亲交友系统的效率和…

架空输电线路故障监测:可视精灵的导线全方位监测之道

集高科技与智能化于一身的“架空输电线路故障可视精灵”,以精准、高效、全面的监测能力,成为守护输电线路安全的得力助手,接下来,深圳鼎信智慧带您走近它: 技术概述 物联网(IoT):通…

JavaSE-易错题集-004

1. 以下关于对象序列化描述正确的是 A 使用FileOutputStream可以将对象进行传输 B 使用PrintWriter可以将对象进行传输 C 使用transient修饰的变量不会被序列化 D 对象序列化的所属类需要实现Serializable接口 参考答案:CD 考点:对象序列化 题解&…

MYSQL1

一、为什么学习数据库 1、岗位技能需求 2、现在的世界,得数据者得天下 3、存储数据的方法 4、程序,网站中,大量数据如何长久保存? 5、数据库是几乎软件体系中最核心的一个存在。 二、数据库相关概念 (一)数据库DB 数据库是将大量数据保存起来,通过计算机加…

反向沙箱-安全上网解决方案

随着信息化的发展,企业日常办公越来越依赖互联网。终端以及普通PC终端在访问互联网过程中,会遇到各种各样不容忽视的风险,例如员工主动故意的数据泄漏,后台应用程序偷偷向外部发信息,木马间谍软件的外联,以…

Leetcode 最大子数组和

使用“Kadane’s Algorithm”来解决。 Kadane’s Algorithm 在每个步骤中都保持着一个局部最优解,即以当前元素为结尾的最大子数组和(也就是局部最优解),并通过比较这些局部最优解和当前的全局最优解来找到最终的全局最优解。 Kadane’s Algorithm的核…

Python全网最全基础课程笔记(七)——列表,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

本专栏系列为Pythong基础系列,每篇内容非常全面,包含全网各个知识点,非常长,请耐心看完。 每天都会更新新的内容,搜罗全网资源以及自己在学习和工作过程中的一些总结,可以说是非常详细和全面。 以至于为什么…

如何划分类/单一职权原则SRP

参考:单一职责 -- 每个类只负责一个功能_每个类应该只负责一个功能,遵循单一职责原则。-CSDN博客 类有且只有一个原因需要修改它,这样的才是一个结构简洁的类。 结合上面的例子,需要注意的点: 1.比如搜索数据库,需要…

解锁生活密码,AI答案之书解决复杂难题

本文由 ChatMoney团队出品 介绍说明 “答案之书智能体”是您贴心的智慧伙伴,随时准备为您解答生活中的种种困惑。无论您在工作中遭遇瓶颈,还是在情感世界里迷失方向,亦或是对个人成长感到迷茫,它都能倾听您的心声,并给…

SpringCloud之配置中心git示例

SpringCloud之配置中心git示例 随着线上项目变的日益庞大,每个项目都散落着各种配置文件,如果采用分布式的开发模式,需要的配置文件随着 服务增加而不断增多。 某一个基础服务信息变更,都会引起一系列的更新和重启,…

Flutter中自定义气泡框效果的实现

在用户界面的设计中,气泡框(Bubble)是一种非常有效的视觉工具,它可以用来突出显示信息或提示用户。气泡框广泛应用于聊天应用、通知提示等场景。在 Flutter 中,虽然有很多现成的气泡框组件,但如果你想要更多…

前端:HTML、CSS、JS、Vue

1 前端 内容概要 了解前端三件套(HTML、CSS、JS)在前端所起的作用掌握HTML标签的功能,掌握重要标签(a标签,form标签)了解CSS了解JS的基础语法掌握Vue的基础语法重点掌握Vue项目怎么启动项目掌握前后端分离是什么。前端做什么事情,后端做什么…

elementUI之不会用

form表单注意事项 <template><div class"container"><el-form :model"form" label-width"80px" :rules"RulesName" ref"loginForm"><el-form-item label"姓名" prop"username">…

【Unity错误】No cloud project ID was found by the Analytics SDK

在编译默认的URP 2D项目时&#xff0c;出现这样一个错误&#xff1a;No cloud project ID was found by the Analytics SDK. This means Analytics events will not be sent. Please make sure to link your cloud project in the Unity editor to fix this problem. 原因&…

hiprint打印/jsPDF使用/html2canvas

最初我知道hiprint.print是可以打印双模板的&#xff0c;于是查看hiprint.print的源码发现底层实现是this.getHtml(t).hiwprint,于是断点查看getHtm的实现&#xff0c;得知它是遍历我们对print传参的list&#xff0c;利用list中模板对象的getHtml()方法得到模板的dom对象&#…

干货 | Selenium+chrome自动批量下载地理空间数据云影像

1.背景介绍 1.1地理空间数据云 由中国科学院计算机网络信息中心科学数据中心成立的地理空间数据云平台是常见的下载空间数据的平台之一。其提供了较为完善的公开数据&#xff0c;如LANDSAT系列数据&#xff0c;MODIS的标准产品及其合成产品&#xff0c;DEM数据&#xff08;SR…

NVIDIA驱动学习

lspci | grep -i vga 输出&#xff1a; 2d:00.0 VGA compatible controller: NVIDIA Corporation Device 2204 (rev a1) 99:00.0 VGA compatible controller: NVIDIA Corporation Device 2230 (rev a1)import torch print(torch.version.cuda) # 应该显示 CUDA 版本 print(tor…