redis_列表对象
《Redis设计与实现》中说:redis列表对象有两种底层编码格式:ziplist、linkedlist,其中ziplist用压缩列表实现、linkedlist用双向链表实现
但我在实践中,没有发现linkedlist的使用,而发现了一种叫"quicklist"的type,意为一个由ziplist组成的双向链表
首先了解列表对象的结构
// redis对象内存分配,列出主要相关的属性
redisObject {
// 对于列表对象,type = REDIS_LIST
type
// 列表对象的底层编码格式,有三种:ziplist、linkedlist、quicklist
encoding
// 指向实际保存列表内容的空间
ptr
// 还有其他属性
......
}
上面的redisObject不实际保存列表内容,而是通过ptr指向实际保存列表内容的空间
根据编码格式的不同,ptr所指向的空间的结构会有所区别
ziplist编码
ziplist的实现为压缩列表,这个结构在redis中经常用到,
核心思想:能不用指针就不用指针,尽量依靠"记录各个节点、头尾之间的字节偏移量,来达到指针的效果"
一个基本的压缩列表其空间分配如下:

zlbytes:4字节,记录整个压缩列表占用的字节大小
zltail:4字节,记录"tail数据节点的起止地址"距离"整个压缩列表起始地址"的字节偏移量
zllen:2字节,记录节点数量(2直接最大只能存65536,所以当zllen<65536时是准确值,zllen=65536时,需要遍历才能知道准确值)
entryX:实际保存的数据,长度就不固定了
zlend:1字节,内容为0xFF,是压缩列表的结束标志
其中每个entryX,其内部结构由 previous_entry_length 、 encoding 、 content 三个部分组成:

previous_entry_length:保存了前一个entry节点的总长度
- 如果前驱的长度<254字节,那么previous_entry_length采用 1字节
 - 如果前驱的长度>=254字节,那么previous_entry_length采用 5字节,其中第一字节内容固定为0xFE(254),后四个字节来保存前驱的长度。(好像没有考虑过前驱超级长,比 2^8 * 5 还长的情况)
 
encoding:保存content中数据的类型
content:存数据。整数就直接是整数、字符串是字符串对象
ziplist这种结构的好处:
- 数据连续且很紧凑,空间利用效率好
 
存在的问题:
- 不利于增删数据,需要频繁修改内存
 - 存在"连锁更新"问题:
 - 有这样一种情况,列表中有一串节点,大小比如都是253字节
 - 突然在其中插入了一个大小为600字节的节点,这时其next节点本身只用1字节来保存pre节点的大小,现在不行了,需要改成5字节
 - 改成5字节后,next节点大小变成了253-1+5=257字节,next的next也不能再用1字节了,也得扩
 - ......
 - 当在一串大小临界的节点中插入一个大数据时,会出现连锁更新现象,导致频繁分配内存
 - 在一串大小刚刚超过254的节点中删除一个小数据时,也会出现类似的情况,频繁缩小内存
 - 问题本身不常遇到
 
应用场景:
- 列表较短,并且数据都是小整数值、短字符串
 - 当一个哈希键只包含少量kv对、且key和value都是小整数值、短字符串时,redis也会使用压缩列表来做
 127.0.0.1:> hmset profile "name" "jack" "age"
OK
127.0.0.1:> object encoding profile
"ziplist"
linkedlist编码
没有很特别,ptr指向一个双端链表
quicklist编码
《Redis设计与实现》中没有具体写。其结构为 A doubly linked list of ziplists,一个由ziplist组成的双向链表
其本身还是一个双向链表,但链表的每个节点不只保存一个数据,而是保存着一个ziplist
我理解是ziplist和linkedlist的一种结合:从整体上看整个list是不连续的,每个节点之间依靠指针访问。从局部上看数据是连续的,每个节点内依靠压缩列表实现,提高空间利用效率
redis_列表对象的更多相关文章
- redis 系列11 列表对象
		
一. 列表对象概述 Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素到列表的头部(左边)或者尾部(右边).一个列表最多可以包含 232 - 1 个元素 (4294967295, ...
 - (63)Wangdao.com第十天_预处理、预解析_函数 上下文对象、参数列表对象
		
预解析.预处理 1. 在全局代码执行之前,js 引擎 就会创建一个栈来存储管理所有的 执行上下文对象 2. 在 全局执行上下文 window 确定以后,进行压栈 3. 在 函数执行上下文对象 确定以后 ...
 - JSON的String字符串与Java的List列表对象的相互转换
		
1.JSON的String字符串与Java的List列表对象的相互转换 在前端: 1.如果json是List对象转换的,可以直接遍历json,读取数据. 2.如果是需要把前端的List对象转换为jso ...
 - python之列表对象
		
1. 获取列表中的某个值 描述:获取下标所对应的值 语法: print(li[0]) #[取索引值] 样例: li = list(['a','b','c']) val=(li[0]) #获取下标所对应 ...
 - redis_字符串对象
		
Redis总共支持五种数据类型:string,hash,list,set及zset.这里介绍字符串类型的实现 首先了解字符串对象的结构 // redis对象内存分配,列出主要相关的属性 redisOb ...
 - java 8中列表对象多条件排序
		
java 8 新加了 lambda 表达式,当接口是一个 @FunctionalInterface 时可以使用 lambda 表达式代替 Function典型的应用场景为:A. 1个只有1个方法的接口 ...
 - python基础:11.列表对象属性排序
		
def __lt__ def __gt__ def __repr__
 - python 列表对象的增减
 - springMVC List对象转换为json列表对象
		
@ResponseBody @RequestMapping("xxx.do") public List<POJO> getList(){ return List< ...
 
随机推荐
- SVN使用教程总结(转载)
			
SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subversion是什么? ...
 - inline-block的理解
			
首先我们大概区分下 inline与inline-block.block的区别, 官方定义如下: inline:内联元素,从左到右依次排列,宽度高度由内容决定: block:块级元素,独占一行,可以设定 ...
 - editplus注册码
			
EditPlus5.0注册码 注册名 Vovan 注册码 3AG46-JJ48E-CEACC-8E6EW-ECUAW EditPlus3.x注册码 EditPlus注册码生成器链接 http://ww ...
 - jdbc访问pipelinedb
			
建立Stream及视图 pipeline.execute("create stream caesar(name text,info json);") #创建stream,字段nam ...
 - 每日笔记-redis的理解及相关应用
			
原文链接:常见面试题 本文大纲与之类似,在其基础上加入了自己在实际项目中对部分知识点的理解 Q1:谈谈对redis的理解 Q2:谈谈实际应用中怎么用redis的 2.1 缓存 2.2 分布式锁 2.3 ...
 - Windows防火墙开启ping,禁ping的配置
			
当我通过本机Ping另一台在同一局域网内(即在同一网段)的计算机时,发现,如果防火墙开启的话,无论如何也ping不通.一旦关闭防火墙就可以ping通了.这是为什么呢?究竟该怎么设置呢? 原因是这样的, ...
 - git 免密码push
			
git版本2.14.1 windows系统 用户根目录 .gitconfig 文件添加配置 [credential] helper = store[push] default = simple 用户根 ...
 - POJ—1321(棋盘问题)
			
题目链接:https://cn.vjudge.net/contest/65959#problem/A 入门dfs,给一张地图,由“#”和“.”组成,“#”处可以放棋子,且棋子不能同行同列,问放满所有“ ...
 - sliding window:"Marginalization","Schur complement","First estimate jacobin"
			
[1]知行合一2 SLAM中的marginalization 和 Schur complement SLAM的Bundle Adjustment上,随着时间的推移,路标特征点(landmark)和相机 ...
 - Memcached和Memcache安装(64位win7)[z]
			
http://www.cnblogs.com/lucky-man/p/6126667.html 一.Memcached和Memcache的区别: 网上关于Memcached和Memcache的区别的理 ...