《闲扯Redis四》List数据类型底层编码转换
一、前言
Redis 提供了5种数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要。

Redis 中的 list 是我们经常使用到的一种数据类型,根据使用方式的不同,可以应用到很多场景中。
二、编码转换
上节《闲扯Redis三》Redis五种数据类型之List型 中说道,List类型有两种实现方式:
1、使用压缩列表(ziplist)实现的列表对象
2、使用双端链表(linkedlist)实现的列表对象
并且,留下了一个疑问?Redis列表什么时候会使用 ziplist 编码,什么时候又会使用 linkedlist 编码呢?
参见了《Redis设计与实现》,得出了一个结论: ziplist 与 linkedlist 之间存在着一种编码转换机制,当列表对象可以同时满足下列两个条件时,列表对象采用ziplist编码,否则采用linkedlist编码
(1)列表对象保存的所有字符串元素的长度都小于64字节;
(2)列表元素保存的元素数量小于512个;
注意 :以上两个条件的上限值可以在配置文件中修改 list-max-ziplist-value 选项和 list-max-ziplist-entries 选项,另外对于使用 ziplist 编码的列表对象,当以上两个条件中任何一个不能满足时,对象的编码转换操作就会执行,原本保存在压缩列表里面的所有列表元素都会被转移并保存到双端链表里面,对象的编码也从 ziplist 变为 linkedlist 。
三、操作验证
书中是这样说的,但是还是要自己操作验证一下的,go!
咦,什么鬼,不是说 ziplist 和 linkedlist ,还有编码转换吗,咋一个都不是,这个 quicklist 是什么结构?看到这大家可能有一点懵逼,细品之后甚至想要动手:七哥,你TM是不是在忽悠我?
嗯,这个不要急,听我继续哔哔( 假装冷静 )
先来看一下操作的redis的版本:
./redis-server --version
版本显示:
再看一下,黄建宏老师《Redis设计与实现》第二版中对应的redis版本:3.0,查阅资料发现 redis 在 3.2 版本的时候,考虑到redis的空间存储效率和时间效率,引入了quicklist(快速列表)作为 list 的底层实现,原来是这样啊!
这就能说的通了,哈哈哈,下节咱们就来看看这个 quicklist 究竟是个什么啥,前面针对 3.0 版本的分析,看都看了,还能怎么办呢,权当做个了解了!
四、要点总结
(1)(Redis 3.2 版本前)列表对象底层实现的方式,压缩列表(ziplist)与双端链表(linkedlist)存在转换
(2)(Redis 3.2 版本前)同时满足两个条件:列表对象保存的所有字符串元素的长度都小于64字节;列表元素保存的元素数量小于512个;列表对象采用 ziplist 编码,否则采用 linkedlist 编码
(3)(Redis 3.2 版本)考虑到 Redis 的空间存储效率和时间效率,引入了 quicklist(快速列表)作为 list 的底层实现
下节继续...
《闲扯Redis四》List数据类型底层编码转换的更多相关文章
- Redis(四):常用数据类型和命令
命令手册网址 http://doc.redisfans.com/ Redis数据类型 l String l Hash l List l Set l Sorted Set Redis中还有3种特殊的数据 ...
- 《闲扯Redis五》List数据类型底层之quicklist
一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...
- 《闲扯Redis十一》Redis 有序集合对象底层实现
一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...
- Redis(三)--- Redis的五大数据类型的底层实现
1.简介 Redis的五大数据类型也称五大数据对象:前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject:这个对象系统包 ...
- 《闲扯Redis六》Redis五种数据类型之Hash型
一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...
- 《闲扯Redis七》Redis字典结构的底层实现
一.前言 上节<闲扯Redis六>Redis五种数据类型之Hash型 中说到 Hash(哈希对象)的底层实现有: 1.ziplist 编码的哈希对象使用压缩列表作为底层实现 2.hasht ...
- 《闲扯Redis九》Redis五种数据类型之Set型
一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...
- Redis基本数据类型底层数据结构
Redis数据类型底层数据结构 Redis目前基本的数据类型有String.List.Set.ZSet.Hash五种,首先Redis是C语言开发的,所以底层就是用C语言封装数据结构或者C语言本身提供的 ...
- Redis系列四:redis支持的数据类型
一.字符串<String> 1. 字符串类型:实际上可以是字符串(包括XML JSON),还有数字(整形 浮点数),二进制(图片 音频 视频),最大不能超过512MB 2. 设值命令: s ...
随机推荐
- Codeforces Round #369 (Div. 2)E
ZS and The Birthday Paradox 题目:一年有2^n天,有k个人,他们的生日有冲突的概率是多少?答案用最简分数表示,分子分母对1e6+3取模.1 ≤ n ≤ 10^18, 2 ≤ ...
- 面试官:说说你对css效率的理解
大家好,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 大家的支持是我创作的动力. 选择器的优先级 众所周知,选择器是有权重 ...
- A Systems-Level Characterization of the Differentiation of Human Embryonic Stem Cells into Mesenchymal Stem Cells (解读人:王欣然)
文献名:A Systems-Level Characterization of the Differentiation of Human Embryonic Stem Cells into Mesen ...
- [极客大挑战 2019]BabySQL 1
考点就是一系列的sql注入操作 和 replace函数过滤 进入页面如图 基础过滤测试 union .select .information_schema试试有没有被过滤 ?username=ad ...
- python基础知识8——常见内置模块
Python之路-python(常用模块学习) 模块介绍 time &datetime模块 random os sys shutil shelve xml处理 yaml处理 configpar ...
- jupyter之配置自己喜欢的python环境
之前安装anaconda,会自动安装jupyer笔记本,但是本人从来没有用过,近期查看github上的一些教程时,发现很多文件都是.ipynb为后缀的jupyter文件,于是自己准备琢磨一下把环境换成 ...
- NLP interview
2019-08-26 17:19:58 1)聊实习项目 2)代码题,二维数组中的查找某个target 3)讲一些最能体现创新能力的工作,而不是一些工程上的实现 4)讲论文可以从哪些方面做创新点,文本生 ...
- 从ISTIO熔断说起-轻舟网关熔断
最近大家经常被熔断洗脑,股市的动荡,让熔断再次出现在大家眼前.微服务中的熔断即服务提供方在一定时间内,因为访问压力太大或依赖异常等原因,而出现异常返回或慢响应,熔断即停止该服务的访问,防止发生雪崩效应 ...
- Python电影数据分析
数据说明:MovieLens数据集,它包含来自于943个用户以及精选的1682部电影的100K个电影打分.每个用户至少为20部电影打分,数据类型user id | item id | rating | ...
- Jenkins打造多分支流水线指南
overview: 多分支工作流程带来了以下几个关键能力: 在代码仓库中,每个新分支都有自己单独的工作流水线(job). 每个工作流水线都记录了对应分支的构建和变更历史. 可以自定义设置流水线随着分支 ...