最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

大厂面试题:请你说说Redis数据类型中的zset,它和set有什么区别?底层是怎么实现的?

XAMPP新闻 admin 208浏览 0评论

一、得分点 

有序无序、底层结构

二、标准回答 

Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double 类型的分数。Redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数 ( score) 却可以重复。

set是是无序的,通过hashtable实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为232 – 1( 4294967295 ) , 每个集合可存储 40 多亿个成员。

zset是有序的,底层的存储结构包括ziplist或skiplist,在同时满足有序集合保存的元素数量小于128个和有序集合保存的所有元素的长度小于64字节的时候使用ziplist,其他时候使用skiplist。当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值。当skiplist作为zset的底层存储结构的时候,使用skiplist按序保存元素及分值,使用dict来保存元素和分值的映射关系。 

三、加分回答 

实际上单独使用Hashmap或skiplist也可以实现有序集合,Redis使用两种数据结构组合的原因是如果我们单独使用Hashmap,虽然能以O(1) 的时间复杂度查找成员的分值,但是因为Hashmap是以无序的方式来保存集合元素,所以每次进行范围操作的时候都要进行排序;而如果单独使用skiplist,虽然能执行范围操作,但查找操作的复杂度却由 O(1)变为了O(logN)。因此Redis使用了两种数据结构来共同实现有序集合。

转载请注明:XAMPP中文组官网 » 大厂面试题:请你说说Redis数据类型中的zset,它和set有什么区别?底层是怎么实现的?

您必须 登录 才能发表评论!