美文网首页
redis的数据结构及其内部编码

redis的数据结构及其内部编码

作者: 阿长_一个程序员 | 来源:发表于2019-10-17 16:17 被阅读0次

    redis有5种基本的数据结构string, list, set, zet, hash, 其对应的内部编码如图所示


    redis数据结构和内部编码
    为什么一个数据结构由多种内部编码实现?
    • 对内部编码的改进不会影响数据结构
      例如Redis3.2提供了quicklist,结合了ziplist和linkedlist两者
      的优势,而对外部用户来说基本感知不到

    • 可以在不同场景下发挥各自的优势
      例如ziplist比较节省内存,但是在list元素比较多的情况下,性能会有所下降,这时候Redis会根据配置选项将list的内部实现转换为linkedlist

    String

    字符串类型的内部编码有3种:

    • int:8个字节的长整型。
    • embstr:小于等于39个字节的字符串。
    • raw:大于39个字节的字符串
    Hash

    哈希类型的内部编码有2种:

    • ziplist(压缩列表)
      当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist在节省内存方面更优秀。

    • hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)。

    List

    列表类型的内部编码有两种。

    • ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使用。

    • linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现。

    Set

    集合类型的内部编码有两种:

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

    • hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现。

    Zset

    有序集合类型的内部编码有两种:

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

    • skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降。

    相关文章

      网友评论

          本文标题:redis的数据结构及其内部编码

          本文链接:https://www.haomeiwen.com/subject/nksmmctx.html