String
String是Redis最基本的数据类型,它的底层数据结构是一个SDS简单的动态字符串(dynamic string),实际上是一个字节数组。
Hash
Hash是由zipList
和hashTable
组成,默认是zipList
存储,当zipList
达到阈值之后就会转成hashTable
,但是这个过程是不可逆的。
当两个条件都满足时使用zipList否则使用HashTable
hash-max-ziplist-entries:中哈希对象保存的键值对数量小于 512 个;
hash-max-ziplist-value:中的键值对的键和值的字符串长度都小于等于 64byte;
zipList:
ziplist 是一个特殊的双向链表没有维护双向指针
prev next
;而是存储上一个entry的长度和当前entry的长度,通过长度推算下一个元素在什么地方
List
List底层由quicklist组成:
quicklist是一个双向链表,而且是一个基于ziplist的双向链表,quicklist的每个节点都是一个ziplist,结合了双向链表和ziplist的优点。
Set
Set
是一个无序并唯一的键值集合,底层由intset
和hashTable
组成。当元素都是long
类型且元素的个数小于等于set-max-inset-entries
时,用intset
ZSet
Zset是一个有序集合,底层是由zipList和skipList组成,默认是zipList,当集合中元素的数量超过zset_max_ziplist_entries 的值(默认值为 128 ),或者集合中单个元素的长度超过zset_max_ziplist_value 的值(默认值为 64 )时,zipList就会变成skipList。
跳表增删查的时间复杂度都是O(logn)
对于Zrange(),使用红黑树的效率是O(mlogn),跳表是O(logn+m)