Redis数据结构底层原理
Redis数据结构
数据结构 | 底层原理 |
---|---|
String 类型 | String的底层原理是基于 动态字符串 (SDS) 实现的,它不仅保存了数据char[],而且保存了缓冲区已经占用空间的长度,以及缓冲区剩余可用空间的长度。SDS相对于字符串char的优势: (1) 修改SDS时,可以预先检查SDS的缓冲区空间是否足够,如果足够会先拓展SDS的空间,以防止缓冲区溢出。而char字符串不会检查缓冲区是否足够,容易出现溢出情况。 (2) SDS有着预分配空间的机制,可以减少为字符串重新分配空间的次数。 |
List 类型 | List的底层原理是基于 双向链表 实现的。 |
Hash 类型 | Hash的底层原理是基于 字典 实现的, 其解决哈希冲突的方法采用的是拉链法,具体的就是将哈希表的装载因子维持在一个合理的范围之内,方便rehash。 |
Set 类型 | Set的底层原理是基于 intset数据结构和字典 实现的。(1) 当存储的数据全都是整数类型,且数量小于512个时,会使用intset存储数据。intset是一个由整数组成的有序集合,可以进行二分查找。 (2) 当不满足使用intset的条件时,都使用字典存储数据,同样是使用拉链法解决哈希冲突。 |
zSet 类型 | zset中的每个元素包含数据本身和一个对应的分数(score)。zset的数据本身不允许重复,但是score允许重复。其底层原理是: (1) 当数据较少时 ,使用 ziplist (压缩列表) 存储数据,它是一种特殊的双向链表。ziplist占用连续内存,每项元素都是(数据+score)的方式连续存储,按照score从小到大排序。(2) 当数据较多时 ,使用 字典 + 跳表 实现:字典用于根据key值查询score,跳表根据socre查找数据 (时间复杂度O(logN))。 |