首页 > 数据库 >redis自学(4)ZipList

redis自学(4)ZipList

时间:2024-02-23 16:24:53浏览次数:28  
标签:字节 ZipList redis length 长度 entry 自学 Previous

ZipList是一种特殊的“双端链表”,由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作,并且该操作的时间复杂度为O(1)。

 

 

 

 

ZipListEntry

ZipList中的Entry并不像普通链表那样记录前后节点的指针,因为记录两个指针要占用16个字节,浪费内存。而是采用了下面的结构:

 

 

Previous_entry_length:前一节点的长度,占1个或5个字节。

  如果前一节点的长度小于254字节,则采用1个字节来保存这个长度值

  如果前一节点的长度大于254字节,则采用5个字节来保存这个长度值,第一个字节为0Xfe,后四个字节才是真实长度数据

encoding:编码属性,记录content的数据类型(字符串还是整数)以及长度,占用1个、2个或5个字节

contents:负责保存节点的数据,可以是字符串或整数

 

ZipList中寻址方式:

正序寻址:当前元素加上自己的Previous_entry_length+encoding+contents的字节长度,就是下一个元素的地址。

倒序寻址,当前元素减去Previous_entry_length离的前一节点长度,就是上一个元素。

ZipList中所有存储长度的数值均采用小端字节序,即低位字节在前,高位字节在后。例如:数值0x1234,采用小端字节序后实际存储值为:0x3412。

 

Encoding编码

ZipListEntry中的encoding编码分为字符串和整数两种:

  字符串:如果encoding是以“00”、“01”或者“10”开头,则证明content是字符串,不同的开头代表不同的字节长度

 

 

 

 

整数:如果encoding是以“11”开始,则证明content是整数,且encoding固定只占用1个字节。

 

 

不同的编码对应不同的整数类型,但是特别小的数据,则是使用1111xxxx来存储。表达范围从0001~1101,1~13,减一之后是0~12,使用这个的好处是省去了content,从而省去了一个字节。

 

 

 

ZipLise的目的是尽可能的节省内存,但是使用限制是只能前序或者后序遍历,所以数据特别多的时候,查询效率较低,所以使用的时候要对节点的个数进行限制。

ZipList的连锁更新问题

假设有N个连续的长度为250~253字节之间的entry,因此entry的Previous_entry_length属性用一个字节表示就行,但是如果往队首放一个大于253字节的entry,那么原先的元素就会变成第二个,而它的Previous_entry_length占中的字节也要改变,因为前一个大于253,所以它的Previous_entry_length占中字节是5,以此类推,下一个元素还要改,下下一个元素也是要改。

ZipList这种特殊情况下产生的连续多次空间扩展操作称之为连锁更新(Cascade Update)。新增、删除都可能导致连锁更新的发生。这种修改,每次都会往后迁移数据,而如果内存不足,就要申请新的内存,销毁,还有数据迁移的动作,但是下一个还是会发生,最影响性能。(因为要求有连续的长度为250~253字节之间的entry,所以概率很低,还有就是ZipList用的很多,修改影响较大,所以作者并未解决此问题)

标签:字节,ZipList,redis,length,长度,entry,自学,Previous
From: https://www.cnblogs.com/bulesea/p/18029811

相关文章

  • Redis分布式锁的正确使用姿势
    前言分布式锁在日常开发中,用处非常的多。包括但不限于抢红包,秒杀,支付下单,幂等,等等场景。分布式锁的实现方式有多种,包括redis实现,mysql实现,zookeeper实现等等。而其中redis非常适合作为分布式锁使用,并且在各个公司都大规模的使用。本文将由浅入深的探究Redis分布式锁的实现,最终......
  • redis
    缓存击穿”通俗的解释就是某个热点数据,某一时刻在缓存中失效,进而大量的请求打到数据库上,就像被击穿了一样。说白了就是某个数据,数据库中有,缓存中没有,一瞬间大量该key的请求打到数据库上,导致数据库被打垮。最常见的场景就是秒杀商品。什么是缓存穿透呢?举个简单栗子,作者开发了一个......
  • 【性能测试】【redis】jmeter实现对redis查询写入压测
    一、jmeter安装RedisDataSet插件首先,我们下载jmeter-plugins-manager-1.6.jar文件,放到jmeter的lib的ext文件夹中,然后重启jmeter。然后,在‘选项’菜单下,点击‘pluginmanager’,打开插件管理弹窗,选择‘AvailablePlugins’,在搜索框中,输入redis然后,选中‘RedisDataSet’,点击......
  • 【性能测试】Redis监控利器---Redis State
    一、本地运行监控神器(以Windows为例)1、安装Jruby,官网地址:http://jruby.org/2、官网下载最新的RedisStatejar包,官网下载地址:https://github.com/junegunn/redis-stat/releases3、启动RedisState进行监控(1)启动命令redis-stat[HOST[:PORT][/PASS]...][INTERVAL[COUN......
  • kettle从入门到精通 第四十五课 ETL之 kettle redis
    1、kettle9.3/9.4spoon客户端中默认是没有redis步骤的,首先想到在kettle的插件市场进行下载redis步骤。 2、可能因为网络原因,直接下载失败了。索性放弃redis原有插件步骤,改为自己通过java代码进行实现,(有java基础的可以通过java代码步骤结合自定义jar包实现一切功能)。 3、将j......
  • Redis实现分布式锁
    方案1:spring-integration-redis组件使用spring-integration-redis组件privatestaticvoidtryLock(){LettuceConnectionFactoryconnectionFactory=createConnectionFactory();RedisLockRegistrylockRegistry=newRedisLockRegistry(connectionFactory,"te......
  • redis
    安装环境与工具yum-yinstallwgetvimtclgccmake下载rediswget wgethttps://download.redis.io/releases/redis-7.0.12.tar.gz 上传 redis-7.0.12.tar.gz 到三台服务器 /data/redis-7.0.12.tar.gz 118.89.112.205 主服务器124.220.13.28  从服务器 ......
  • redis自学(2)IntSet
    IntSetIntSet是redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。  可能会有疑惑,int8_t的数组contents只有1个字节,怎么可能存的下数组,其实这里的contents存储的只是指向真正数组的指针。IntSet的取值范围大小,实际上是由encoding属性决定的......
  • redis
    RedisRedis是基于OpenSourceBSD协议,使用C语言编写的一种Key-Value(键值对)内存数据库 安装 工具 启动服务端redis-server/root/myredisconf/redis.conf-使用指定配置文件启动启动客户端连接redis-cli-aroot-p6379用密码和端口登录授权10大数据类型......
  • Redis
    RedisRedis是基于OpenSourceBSD协议,使用C语言编写的一种Key-Value(键值对)内存数据库安装工具启动服务端redis-server/root/myredisconf/redis.conf-使用指定配置文件启动启动客户端连接redis-cli-aroot-p6379用密码和端口登录授权10大数据类型......