数组:
数组会在内存中开辟一块连续的空间存储数据,这种存储方式有利也有弊端。当获取数据的时候,直接经过下标值就能够获取到对应的元素,时间复杂度为O(1)
。可是若是新增或者删除数据会移动大量的数据,时间复杂度为O(n)
。数组的扩容机制是:
若是数组空间不足,会先开辟一块新的空间地址,将原来的数组复制到新的数组中。java
链表:
链表不须要开辟连续的内存空间,其经过指针将全部的数据链接起来。新增或者删除的时候只须要将指针指向的地址修改就好了,时间复杂度为O(1)
。可是查询的时间复杂度为O(n)
。redis
2.一、双向链表数组
双向链表是各个节点之间的逻辑关系是双向的。
双向链表中节点的组成是:prior:
指向当前节点的前置节点,data:
当前节点存储的数据。next:
指向当前节点的后置节点。性能
2.二、压缩链表ui
2.三、quicklist链表指针
A doubly linked list of ziplists A generic doubly linked quicklist implementation
3.一、双向链表code
3.二、压缩列表blog
3.三、quicklist链表ip
在redis 3.2
版本以前使用的是 双向链表和压缩链表
两种,由于双向链表占用的内存要比压缩链表高,因此建立链表时首先会建立压缩链表
,在合适的时机会转化成双向链表
。redis 3.2
以后使用的是quicklist链表
。内存