底层数据结构
redis常用的数据结构:String、hash、list、set、zet,每个数据结构底层见下图:
哈希表
Redis的Hash,就是在数组+链表的基础上,进行了一些rehash优化等。
双向列表
Redis的链表在双向链表上扩展了头、尾节点、元素数等属性
特点:
可以直接获得头、尾节点。
常数时间复杂度得到链表长度。
是双向链表。
压缩列表ziplist
压缩列表(ziplist)是Redis为了节省内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构,一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值。
压缩列表的原理:压缩列表并不是对数据利用某种算法进行压缩,而是将数据按照一定规则编码在一块连续的内存区域,目的是节省内存。
整数数组intset
Reids对整数存储专门作了优化,intset就是redis用于保存整数值的集合数据结构。当使用set数据结构时,只包含整数元素,redis就会用intset来存储,否则会用hash的key存储。
跳表
skipList中的元素是有序的,所以跳跃表在redis中用在有序集合键、集群节点内部数据结构。它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问节点的目的。具有如下性质:
1、由很多层结构组成;
2、每一层都是一个有序的链表,排列顺序为由高层到底层,都至少包含两个链表节点,分别是前面的head节点和后面的nil节点;
3、最底层的链表包含了所有的元素;
4、如果一个元素出现在某一层的链表中,那么在该层之下的链表也全都会出现(上一层的元素是当前层的元素的子集);
5、链表中的每个节点都包含两个指针,一个指向同一层的下一个链表节点,另一个指向下一层的同一个链表节点;