Redis-第十章节-链表

目录

  • 数组和链表
  • 链表
  • 对比
  • 总结

一、数组和链表

数组:
数组会在内存中开辟一块连续的空间存储数据,这种存储方式有利也有弊端。当获取数据的时候,直接经过下标值就能够获取到对应的元素,时间复杂度为O(1)。可是若是新增或者删除数据会移动大量的数据,时间复杂度为O(n)数组的扩容机制是:若是数组空间不足,会先开辟一块新的空间地址,将原来的数组复制到新的数组中。java

链表:
链表不须要开辟连续的内存空间,其经过指针将全部的数据链接起来。新增或者删除的时候只须要将指针指向的地址修改就好了,时间复杂度为O(1)。可是查询的时间复杂度为O(n)redis

二、链表

2.一、双向链表数组

双向链表是各个节点之间的逻辑关系是双向的。
双向链表中节点的组成是:prior: 指向当前节点的前置节点,data:当前节点存储的数据。next:指向当前节点的后置节点。性能

2.二、压缩链表ui

  • 压缩链表是为了节约内存开发的。
  • ziplist是一个特别的双向链表,没有维护双向指针prev next;反而是存储上一个entry的长度和当前entry长度,经过长度推算出下一个元素在什么地方。
  • 牺牲读取的性能,得到高效的存储空间,由于存储指针比存储entry长度更费内存,这就是典型的时间换空间。

2.三、quicklist链表指针

  • 官网介绍:
A doubly linked list of ziplists
    A generic doubly linked quicklist implementation
  • 介绍:
    quicklist是一个双向链表,而且是一个ziplist的双向链表,ziplist自己是一个维持数据项前后顺序的列表,并且数据项保存在一个连续的内存块种。

三、对比

3.一、双向链表code

  • 双端链表便于在表的两端进行push和pop操做,可是它的内存开销比较大。
  • 双端链表每一个节点上除了要保存的数据以外,还要额外保存两个指针。
  • 双端链表的各个节点是单独的内存块,地址不连续,节点多了容易产生内存碎片。

3.二、压缩列表blog

  • ziplist因为是一块连续的内存,因此存储效率很高。
  • ziplist不利于修改操做,每次数据变更都会引起一次内存的realloc。
  • 当ziplist长度很长的时候,一次realloc可能会致使大批量的数据拷贝,进一步下降性能。

3.三、quicklist链表ip

  • 空间效率和时间效率的折中。
  • 结合了双端链表和压缩列表的优势。

四、总结

redis 3.2版本以前使用的是 双向链表和压缩链表 两种,由于双向链表占用的内存要比压缩链表高,因此建立链表时首先会建立压缩链表,在合适的时机会转化成双向链表redis 3.2以后使用的是quicklist链表内存

相关文章
相关标签/搜索