[Redis专题]list列表操作及其原理分析

一、list操作

在Redis 中,列表操作通常使用list指令进行,类似于java 的LinkedList,Redis 的列表使用的是链表的数据结构进行数据存储。
在这里插入图片描述
上图创建了一个key 为person 的list ,通过lpop 指令将其依次推出队列,可见其满足队列的先进先出(FIFO)原则。

二、list的底层实现

在上小节中提到,Redis 的list 使用的是链表数据结构进行数据存储,这就意味着list 的插入、删除操作非常快,为O(1) 复杂度的操作。而查找操作则十分的缓慢,为O(n)。但实际上,Redis的list并不简单使用链表实现,在list元素较少的时候,使用的是一种连续内存空间的数据结构ziplist(压缩列表)进行存储。这样做的好处是防止过多的不连续的内存碎片产生,同时也避免了过多的链表前趋、后继指针占用过多的内存空间。
但这种 “ 元素少时使用ziplist ,元素多时使用linked list ” 作为list的数据结构的方式只存在于Redis 的早期版本,在新的Redis 版本中,这种数据结构被抛弃了,直接使用的是quicklist 数据结构保存:
在这里插入图片描述
如上图所示,Redis 将多个ziplist 通过双向指针串联起来,实现快速链表结构。
在这里插入图片描述
上图输出字段 encoding 的值:quicklist 是 ziplist 和 linkedlist 的混合体,它将 linkedlist 按段切分,每一段使用 ziplist 来紧凑存储,多个 ziplist 之间使用双向指针串接起来。

三、每个 ziplist 存多少元素

quicklist 内部默认单个 ziplist 长度为 8k 字节,超出了这个字节数,就会新起一个 ziplist。ziplist 的最大长度由配置文件的参数list-max-ziplist-size决定。
redis的配置文件详细内容可见其开源网站Github的源码:https://github.com/antirez/redis/blob/unstable/redis.conf
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值