List【Redis对象篇】

🏆 作者简介:席万里
⚡ 个人网站:

文章目录

  • LIst
    • 1.简介
    • 2.使用场景
    • 3.常用操作
      • 1.写操作
      • 2.读操作
    • 4.底层实现
    • 5.压缩列表的优化
      • 1.ZIPLIST结构
      • 2.ziplist更新数据
      • 3.LISTPACK优化
    • 6.总结(重点)

LIst

1.简介

Redis List是一组连接起来的字符串集合。

List最大的元素个数是2的32次方-1,新版本4.0之后是64次方-1。

2.使用场景

List作为一个列表存储,属于比较底层的数据结构,比如存储一批任务数据、存储一批消息等。

3.常用操作

  • 创建:LPUSH、RPUSH
  • 查询:LLEN、LRANGE
  • 更新:LPUSH、RPUSH、LPOP、RPOP、LREN
  • 删除:DEL、UNLINK

1.写操作

1、LPUSH从左侧插入,RPSH从右侧插入

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

2、LPOP移出并获取列表的第一个元素;RPOP移出并获取列表最后一个元素

在这里插入图片描述

3、LREN key count value,移出值等于value的元素,当count=0,则移出素有等于value的元素,当count>0,则从左到右移出count个,当count<0,则从右到左移出count个。返回被移除元素的数量。

在这里插入图片描述

4、DEL和UNLINK,DEL是同步删除命令,UNLINK是异步删除命令不会阻塞客户端。

2.读操作

1、LLEN,查看list的长度

2、LRANGE,查看从start到stop的元素

在这里插入图片描述

4.底层实现

3.2版本之前,List对象有两种编码方式,ZIPLIST和LINKEDLIST。

ZIPLIST使用条件:

  1. 列表对象保存的所有字符串对象长度都小于64字节。
  2. 列表对象元素个数少于512个。

在这里插入图片描述

LinkedList:

在这里插入图片描述

ZIPLIST和LInkedList相比,ZIPLIST内存更加紧凑,所以只有在列表个数或节点数据比较大的时候,才会使用到LINKEDLIST编码。

所以,ZIPLIST是为了在数据较少时节约内存,LInkedList是为了数据多时提高更新效率,而ZIPLIST数据稍多时会导致很多内存复制。

后来,引入了QUICKLIST,其实就是ZIPLIST和LInkedLIST的结合体。

在这里插入图片描述

原来LInkedList是单个节点,只能存一个数据,现在单个节点存的是一个ZIPLIST,即多个数据。

5.压缩列表的优化

平常说的压缩列表一般是指ZIPLIST,一种是LISTPACK 5.0引入的,直到7.0完全替代了ZIPLIST。

1.ZIPLIST结构

在这里插入图片描述

  • zlbytes:占用4个字节,记录了整个ziplist占用的总字节数。
  • zltail:占用4个字节,指向最后一个entry偏移量,用于快速定位最后一个entry。
  • zllen:占用2字节,记录entry总数。
  • entry:列表元素。
  • zlend:ziplist结束标志,占用1字节,值等于255。

ziplist节点结构

<prevlen> <encoding> <entry-data>

prevlen:表示上一个节点的数据长度。如果前一节点的长度,也就是entry的大小 小于254字节,那么prevlen需要用1字节长的空间来保存这个长度值,255是特殊字符,被zlend占用了。

encoding:编码类型,包含了一个entry的长度信息,可用于正向遍历。

entry-data:实际的数据。

2.ziplist更新数据

更新操作可能带来连锁更新。连锁更新是指这个后移,发生了不止一次,而是多次。

什么是连锁更新?

比如增加一个头部新节点,后面依赖它的节点,需要prevlen记录它的大小,原本只用1字节记录,因为更新可能膨胀为5字节,然后这个entry的大小就也膨胀了。所以,当这个新数据插入导致的后移完成之后,还需要逐步迭代更新。

在这里插入图片描述

3.LISTPACK优化

ziplist需要支持LIST,LIST是双端访问的结构,所以需要能从后向前遍历。

<prevlen> <encoding> <entry-data>

其中,prevlen就表示上一个节点的数据长度,通过这个字段可以定位上一个节点的数据。

那么,我们可不可以改为不记录这个prevlen,但是又能找到上一个节点的起始位置的办法?

<encoding-type> <element-data> <element-tot-len>

encoding-type:是编码类型;element-datt:是数据内容;element-tot-len:存储整个节点除它自身的长度。

要找到上一个节点的秘密就需要element-tot-len

element-tot-len所占用的每个字节的第一个bit用于标识是否结束。0是结束,1是继续,剩下7个bit来存储数据大小。

当我们需要找到当前元素的上一个元素时,我们可以从后向前依次查找每个字节,找到上一个Entry的element-tot-len字段的结束标识。

6.总结(重点)

1、List对象底层编码方式是什么?

3.2版本之前,List底层的编码是ziplist和LInkedlist,当ziplist的节点数量或单个节点大小超过一定阈值时,就会转换成LINKLIST。在3.2版本,结合ziplist和linklist实现了quicklist作为list的新底层编码,而在更新的版本,ziplist优化成了listpack。

2、ziplist怎么压缩数据的?

ziplist采用紧凑的内存结构,节点之间的内存空间都是连续的。ziplist的结构大致可以分为三部分,结构头、数据部分、结尾标志;结构头包含了ziplist总字节大小、ziplist节点个数、ziplist最后一个节点的偏移量;数据部分有N个节点组成,单个节点包含节点编码类型,上一个节点的长度,节点实际数据。

3、ziplist下list可以从后向前遍历吗?

对于ziplist中的每一个节点,都记录了前一个节点的长度,我们可以用当前遍历节点的首地址减去这个长度,就能找到上一个节点的首地址。

4、ziplist的不足

当ziplist的元素个数变得很多之后,查找效率就会下降;而且因为ziplist内存是连续的,当其中一个节点需要更新,或者新增节点时,就需要重新分配内存;再者因为ziplist每一个节点记录了前一个节点的长度,当其中一个节点的长度发生变化时,会导致后面的节点都需要进行更新,引发连锁更新问题。

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

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

相关文章

心情追忆- SEO优化提升用户发现率

之前&#xff0c;我独自一人开发了一个名为“心情追忆”的小程序&#xff0c;旨在帮助用户记录日常的心情变化及重要时刻。我从项目的构思、设计、前端&#xff08;小程序&#xff09;开发、后端搭建到最终部署。经过一个月的努力&#xff0c;通过群聊分享等方式&#xff0c;用…

.NET 技术系列 | 通过CreatePipe函数创建管道

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

springboot425滑雪场管理系统(论文+源码)_kaic

摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定滑雪场管理系统的总体功能模块。然后&#xff0c;详…

Dubbo的应用及注册和SPI机制

Dubbo的应用及注册和SPI机制 Dubbo 的服务注册中应用级注册优化 Dubbo 的注册中心 Dubbo 支持很多种注册中心&#xff0c;支持的主流注册中心包括&#xff1a;ZooKeeper、Nacos、Redis Dubbo 需要引入注册中心依赖&#xff0c;并且配置注册中心地址&#xff0c;这里以 ZooK…

【从零开始入门unity游戏开发之——C#篇05】转义字符、@处理多行文本或者不使用转义字符、随机数

文章目录 一、转义字符1、什么是转义字符&#xff1f;2、常见的转义字符3、总结 二、使用处理多行文本或者不使用转义字符1、多行字符串2、不使用转义字符 三、随机数1、Random.Next()生成随机整数示例&#xff1a;生成一个随机整数生成指定范围内的随机整数 2、Random.NextSin…

【Python】使用Selenium的find_element模块获取网页上的大段文字和表格的方法(建议收藏!)

发现了一个使用Selenium的find_element模块&#xff0c;快速获取文字和表格的方法&#xff0c;很实在&#xff0c;以后爬网的时候&#xff0c;就不用beautifulSoup 和 pandas的read_html 混起来用了&#xff01; 文字部分&#xff1a;实现网络节点下&#xff0c;某个节点下的其…

Windows环境基于ecplise的spring boot框架新建spring start project

SpringToolSuite4 新建项目实例 前言Windows基于ecplise 工具的spring boot 架构 前言 使用Spring boot 框架向前端传输数据 Windows基于ecplise 工具的spring boot 架构 spring-tool-suite-4官网下载链接spring tool&#xff0c;下载太慢的话可以使用迅雷加速&#xff0c;右…

Mave下载、安装以及idea(2024)进行配置

目录 Maven简介 Maven下载 配置环境变量 配置本地仓库 在idea环境配置Maven 使用Maven创建工程 创建一个普通的java工程 创建一个Web项目 Maven简介 Maven是一个跨平台的项目管理工具&#xff0c;也是Apache组织中的一个成功的开源项目。它主要服务于基于Java的项目构…

MySQL八股文

MySQL 自己学习过程中的MySQL八股笔记。 主要来源于 小林coding 牛客MySQL面试八股文背诵版 以及b站和其他的网上资料。 MySQL是一种开放源代码的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;使用最常用的数据库管理语言–结构化查询语言&#xff08;SQL&…

TMS320C55x DSP芯片结构和CPU外围电路

第2章 DSP芯片结构和CPU外围电路 文章目录 第2章 DSP芯片结构和CPU外围电路TMS320C55x处理器的特点TMS320c55x CPU单元指令缓冲(Instruction Buffer Unit) I单元程序流程(Program Flow Unit) P单元地址数据(Address-data Flow Unit) A单元数据计算(Data Computation Unit) D单元…

docker 相关操作

1. 以下是一些常见的 Docker 命令&#xff1a; docker --version显示安装的 Docker 版本。 docker pull <image_name>从 Docker Hub 或其他镜像仓库下载镜像。 docker build -t <image_name> <path>从指定路径的 Dockerfile 构建 Docker 镜像。 docker i…

WinRAR 创建自解压文件 自定义标题 自定义图标 添加桌面快捷方式

一、创建自解压文件 自定义标题 自定义图标 1、利用Winrar压缩你要压缩的文件夹"【游戏运行必备组件】.rar",选择压缩格式是【rar格式】&#xff0c;选择创【建自解压格式…】 2、点击【高级】&#xff0c;选择【自解压文件选项】 3、自定义解压界面【窗口标题】、…

深度学习基础--将yolov5的backbone模块用于目标识别会出现怎么效果呢??

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 yolov5网络结构比较复杂&#xff0c;上次我们简要介绍了yolov5网络模块&#xff0c;并且复现了C3模块&#xff0c;深度学习基础–yolov5网络结构简介&a…

:-1: error: msvc-version.conf loaded but QMAKE_MSC_VER isn‘t set

QT想使用webenginewidgets&#xff0c;因此只能使用MSVC进行编译处理&#xff0c;出现报错:-1: error: msvc-version.conf loaded but QMAKE_MSC_VER isnt set 错误的原因是MSCV版本不匹配 D:\Qt\Qt5.12.9\5.12.9\msvc2017_64\mkspecs\common\msvc-version.conf 报的错如下图…

ElasticSearch - 使用 Composite Aggregation 实现桶的分页查询

文章目录 官方文档概述Composite Aggregation 概述示例&#xff1a;基本分页查询分页&#xff1a;获取下一页结果使用场景注意事项 官方文档 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html#_pagin…

微积分复习笔记 Calculus Volume 2 - 3.7 Improper Integrals

3.7 Improper Integrals - Calculus Volume 2 | OpenStax

C语言程序设计P5-5【应用函数进行程序设计 | 第五节】—知识要点:变量的作用域和生存期

知识要点&#xff1a;变量的作用域和生存期 视频&#xff1a; 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 有一个一维数组&#xff0c;内放 10 个学生成绩&#xff0c;写一个函数&#xff0c;求出平均分、最高分和最低分。 任务要求用一个函数来完…

学习笔记:从ncsi/nc-si协议和代码了解网络协议的设计范式

学习笔记&#xff1a;从ncsi/nc-si协议和代码了解网络协议的设计范式 参考文档&#xff1a; https://www.dmtf.org/standards/published_documents https://www.dmtf.org/dsp/DSP0222 https://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.2.0.pdf参考代…

2024.12.10——攻防世界Web_php_include

知识点&#xff1a;代码审计 文件包含 伪协议 伪协议知识点补充&#xff1a; 在PHP中&#xff0c;伪协议&#xff08;Pseudo Protocols&#xff09;也被称为流包装器&#xff0c;这些伪协议以 php://开头&#xff0c;后面跟着一些参数&#xff0c;用于指定要执行的操作或需要…

Wireshark如何查看数据包时间间隔

1.如果数据包量不大&#xff0c;抓包本身也不大&#xff0c;建议从绝对时间判断&#xff0c;打开wireshark软件&#xff0c;并点开相应要分析的抓包文件。 进入到最上方菜单<视图>,在弹出菜单选择时间显示格式&#xff0c;再在右侧菜单中选择自捕获经过的秒数。 这样就可…