摘抄自《redis深度历险》。
Redis提供了5种基础数据结构,分别是String,list,set,hash和zset。
1、String
Redis所有的键都是String。Redis的String是动态字符串,内部结构类似Java的ArrayList和C++ STL中的Vector。内部分配的容量capacity一般高于字符串实际长度len,字符串长度小于1M时,扩容时capacity*2,长度大于1M时,扩容时一次只扩1M空间。
字符串最大长度512M。
2、list
Redis的列表实现是一个链表,因此list的插入和删除非常快,但是索引定位很慢。当列表弹出最后一个元素后,该数据结构自动被删除,内存被回收。
Redis的列表结构常用来做异步队列使用,将需要延后处理的任务结构体序列化成字符串塞进Redis的列表,另一个线程从这个列表中轮询数据进行处理。
Redis的list底层存储的不是一个简单的linkedlist,而是称为快速链接quicklist的一个结构。列表元素较少时使用连续的一块内存(ziplist),它将所有元素紧挨着一起存储。分配的是一块连续的内存。当数据量比较多时改成quicklist。因为普通的链表需要附加指针空间(例如当存储的数据时int时,pre和next两个指针就比存储的数据大多了),并且加剧内存碎片化。因此Redis将链表和ziplist结合起来使用,既满足了插入删除性能,又不会出现太大的空间冗余。
3、Set
相当于Java的HashSet。
4、Hash
相当于Java中的HashMap。它是无序字典,内部实现是数组+链表。当发生hash碰撞时,元素用链表串起来。不过,Redis的Hash键只能是String。而且,Java的hashmap在rehash时是一次性的,而Redis为了高性能采用了渐进式rehash。
5、zset
zset是一个有序集合,它可以保证元素的唯一性,并且可以给每个元素赋予score,代表该元素的排序权重。它的内部实现是一种叫“跳跃列表”的数据结构。