Redis 数据结构

1.Redis 数据类型之一 字符串

  1.1 它是由Redis自己的SDS(简单动态字符串)实现的管理string的

    1.1.1 SDS 的结构可以减少修改字符串时带来的内存重分配的次数,这依赖于内存预分配和惰性空间释放两大机制。
    1.1.2 当 SDS 需要被修改,并且要对 SDS 进行空间扩展时,Redis 不仅会为 SDS 分配修改所必须要的空间,还会为 SDS 分配额外的未使用的空间。
    1.1.3 如果修改后, SDS 的长度 (也就是 len 属性的值) 将小于 1MB ,那么 Redis 预分配和 len 属性相同大小的未使用空间。
    1.1.4 如果修改后, SDS 的长度将大于 1MB ,那么 Redis 会分配 1MB 的未使用空间。
    1.1.5 比如说,进行修改后 SDS 的 len 长度为 20 字节,小于 1MB,那么 Redis 会预先再分配 20 字节的空间, SDS 的 buf 数组的实际长度 (除去最后一字节) 变为 20 + 20 = 40 字节。当 SDS 的 len 长度大于 1MB 时,则只会再多分配 1MB 的空间。
    1.1.5 类似的,当 SDS 缩短其保存的字符串长度时,并不会立即释放多出来的字节,而是等待之后使用。

  1.2 内部实现数据格式

    1.2.1 int:8个字节的长整型。

    1.2.2 embstr:小于等于39个字节的字符串。

    1.2.3 raw:大于39个字节的字符串。

2.Redis 数据类型之一 Hash

  2.1 底层实现的数据结构

    当哈希类型元素个数小于hash-max-ziplist-entries 配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64 字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的 结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀

    2.1.1 压缩列表(ziplist)

    2.1.2 HashTable(哈希表)

 

3. Redis数据类型之一 List

  3.1 底层实现的数据结构

    当有序集合的元素个数小于zset-max-ziplist- entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配 置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist 可以有效减少内存的使用。

    3.1.1 压缩列表(ziplist)

    3.1.2 跳跃链表(skiplist)

4. Redis数据类型之一 Set

  4.1 底层实现的数据结构

    当集合中的元素都是整数且元素个数小于set-max- intset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实 现,从而减少内存的使用。

    4.1.1 intset(整数集合)

    4.1.2 HashTable(哈希表)

5.Redis数据类型之一 Zset

  5.1 底层实现的数据结构

    当有序集合的元素个数小于zset-max-ziplist- entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配 置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist 可以有效减少内存的使用。

    5.1.1 压缩列表(ziplist)

    5.1.2 跳跃链表(skiplist)

6.Redis数据类型之一HyperLoglog

  6.1 底层实现的数据结构

    每一个key最多只需要花费12K大小,但是存在误差,误差大概在0.81%

    6.1.1 稀疏矩阵存储

    6.1.2 稠密矩阵

 

7.Redis数据类型之一 Stream

  7.1 底层实现的数据结构

    listpack ~ 一个字符串列表的序列化格式,也就是将一个字符串列表进行序列化存储。Redis listpack可用于存储字符串或者整型。

    7.1.1 压缩前缀树

    7.1.2 紧凑列表

 

上一篇:《redis》之缓存


下一篇:Redis之数据结构