redis有5种数据类型,包括:redis
和集合同样,有序集合也是 string 类型元素的集合,且元素不容许重复。不一样的是,有序集合的每一个元素都会关联一个 double 类型的分数(score)。redis 经过分数来为集合中的成员进行从小到大的排序。ide
有序集合的成员是惟一的,但分数却能够重复。性能
有序集合查找任意数据的时间复杂度是O(1),插入、删除操做的时间复杂度是O(logN)。设计
因为有序集合能够根据分数对元素进行排序,所以有序集合可用于排行榜、学生成绩排名等用途。3d
出于对性能的考虑,有序集合底层有两类实现:指针
ziplist(压缩列表)实现的有序集合对象中,每一个元素是用须要使用两个连续的压缩列表节点保存,第一个节点保存元素的成员,第二个节点保存元素的分值,分值为double 类型。对象
压缩列表内的元素,会按照分值,从小到大排序。若是分值相同,则按照元素成员的大小,从小到大排序。大体以下图所示:blog
skiplist(跳跃表)采用了链表加多级索引的结构。它使用了空间换时间的设计思路,在存储时创建了不少级索引。使得在跳跃表中查找、插入和删除的时间复杂度都是O(logN)。排序
它的实现大体以下图所示:索引
有序列表使用skiplist(跳跃表)+字典实现,是为了保证查找和范围型操做(ZRANK、ZRANGE等)都能尽量快的执行。
例如只使用跳跃表,查找单个成员,复杂度为O(logN)。
例如只使用字典,因为字典是无序的,范围型的操做,会须要使用至少O(NlogN)时间复杂度和额外的O(N)空间对数据排序,再进行范围型操做。
而同时使用跳跃表+字典,查找单个成员,能够直接在字典中查找,复杂度为O(1),范围型操做则在跳跃表中操做,复杂度为O(lngN)。