介绍一下redis中常用数据结构的底层实现?

提问者:帅平 问题分类:面试刷题
介绍一下redis中常用数据结构的底层实现?
5 个回答
温柔刀下鬼
温柔刀下鬼
Zset (Sorted Set)
用途:有序的字符串集合,每个元素关联一个分数,通过分数进行排序。
底层实现:
跳跃表(skiplist):跳跃表是一种概率数据结构,提供高效的范围查询和插入操作。跳跃表通过多层索引来加速查找过程。
字典(Dictionary):字典用于存储成员到分数的映射,以便快速查找成员的分数。
Zset 内部使用两种数据结构来实现。
跳跃表和字典共同工作,确保 Zset 既能高效地进行范围查询,又能快速地进行成员查找。

转换阈值:
每个成员的最大长度:zset-max-ziplist-value(默认 64 字节)
有序集合的最大成员数量:zset-max-ziplist-entries(默认 128 个成员)
发布于:7个月前 (10-15) IP属地:四川省
一鹿有晗
一鹿有晗
Set
用途:无序的字符串集合,不允许重复元素。
底层实现:
当集合中的元素较少时,Redis 使用整数集合(intset)来存储数据。整数集合是一个有序的整数数组,支持快速查找和插入操作。
当集合中的元素较多时,Redis 会将整数集合转换为字典(Dictionary)。字典提供高效的查找和插入操作,适用于大量数据的情况。

转换阈值:
整数集合中的最大元素数量:没有明确的配置项,但当集合中的元素不再是整数或元素数量超过一定阈值时,会自动转换为字典。
发布于:7个月前 (10-15) IP属地:四川省
帅的被人砍
帅的被人砍
List
用途:有序的字符串列表,可以在列表的两端进行插入和删除操作。
底层实现:
当列表中的元素较少时,Redis 使用压缩列表(ziplist)来存储数据。压缩列表可以高效地存储小数量的数据,并且占用更少的内存。
当列表中的元素较多时,Redis 会将压缩列表转换为双端链表(linked list)。双端链表允许在列表的两端进行高效的插入和删除操作,但访问中间元素的效率较低。

转换阈值:
每个元素的最大长度:list-max-ziplist-value(默认 64 字节)
列表的最大元素数量:list-max-ziplist-entries(默认 512 个元素)
发布于:7个月前 (10-15) IP属地:四川省
青山依旧
青山依旧
Hash
用途:用于存储字段和值之间的映射关系,类似于 Java 中的 HashMap。
底层实现:
当哈希表中的元素较少时,Redis 使用压缩列表(ziplist)来存储数据。压缩列表是一种特殊的双向链表,它可以高效地存储小数量的数据,并且占用更少的内存。
当哈希表中的元素较多时,Redis 会将压缩列表转换为字典(Dictionary)。字典是一个由多个桶(bucket)组成的数组,每个桶中包含一个链表,用于处理哈希冲突。

转换阈值:
每个字段的最大长度:hash-max-ziplist-value(默认 64 字节)
哈希表的最大字段数量:hash-max-ziplist-entries(默认 512 个字段)
发布于:7个月前 (10-15) IP属地:四川省
自愈
自愈
String
用途:用于存储简单的键值对,可以是字符串、整数或浮点数。
底层实现:
Redis 的 String 类型内部使用 sds (简单动态字符串) 结构来存储数据。sds 是 Redis 自己实现的一种字符串结构,它在 C 字符串的基础上增加了长度信息,并且提供了高效的内存管理和扩展能力。
发布于:7个月前 (10-15) IP属地:四川省
我来回答