美文网首页
Redis数据结构底层编码转换

Redis数据结构底层编码转换

作者: Reiko士兵 | 来源:发表于2022-05-12 20:59 被阅读0次

    1、string

    string在redis中有三种编码类型:int \rightarrow embstr \rightarrow raw

    类型使用条件

    int:存储的值为 -2^63~2^63-1 之间的整数

    embstr:存储的值不属于int(如超出int范围的整数,或者其它字符),且长度不超过44个字节

    raw:存储的值长度超过44字节

    ### 为了节省篇幅,删除了部分命令结果和换行,下同
    ## int
    >> set test -9223372036854775808  # -2^63 = -9223372036854775808
    >> object encoding test
    "int"
    >> set test -9223372036854775809
    >> object encoding test
    "embstr"
    >> set test 9223372036854775807  # 2^63-1 = 9223372036854775807
    >> object encoding test
    "int"
    >> set test 9223372036854775808
    >> object encoding test
    "embstr"
    
    ## embstr
    >> set test a
    >> object encoding test
    "embstr"
    >> set test abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqr #长度44
    >> object encoding test
    "embstr"
    >> set test abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrs
    >> object encoding test
    "raw"
    
    编码转换
    # append等修改操作会将类型转换为raw,incr/decr等数值运算操作则会将类型转换为int
    >> set test 1
    >> object encoding test
    "int"
    >> append test 1
    >> object encoding test
    "raw"
    >> incr test
    (integer) 12
    >> object encoding test
    "int"
    >> set test x
    >> object encoding test
    "embstr"
    >> append test 1
    >> object encoding test
    "raw"
    >> del test
    
    补充说明

    1、为什么是44字节?

    内存分配器分配内存的时候,一般是2、4、8、16、32、64,在embstr类型中,RedisObject结构体占了16字节,SDS8结构体占了3字节,字符串结尾"\0"占一字节,故64-16-3-1=44。

    2、list

    3.0版本前list在redis中有两种编码类型:ziplist和linkedlist,3.0版本后只有quicklist

    为什么不用ziplist:1、中间元素查找复杂度高 2、存在连锁更新风险

    quicklist优点:控制了ziplist长度,从而降低了中间元素查找复杂度和连锁更新的风险

    相关参数
    参数项 默认值 说明
    list-max-ziplist-size -2 参数用于控制quicklist中每个ziplist最大大小,-2表示不超过8kb

    3、 hash

    Hash在redis中有两种编码类型:ziplist和hashtable

    编码转换
    # hash-max-ziplist-entries 使用ziplist时键值对最大数量
    >> config set hash-max-ziplist-entries 3
    "OK"
    >> hset test 1 a 
    >> hset test 2 b
    >> hset test 3 c
    >> object encoding test
    "ziplist"
    >> hset test 4 d
    >> object encoding test
    "hashtable"
    >> config set hash-max-ziplist-entries 512
    >> del test
    
    # hash-max-ziplist-value 使用ziplist时值的最大长度
    >> config set hash-max-ziplist-value 8
    "OK"
    >> hset test 1 abcdefgh # 长度8
    >> object encoding test
    "ziplist"
    >> hset test 2 abcdefghi
    >> object encoding test
    "hashtable"
    >> config set hash-max-ziplist-value 64
    >> del test
    
    相关参数
    参数项 默认值 说明
    hash-max-ziplist-entries 512 使用ziplist时键值对最大数量,超过此数量使用hashtable
    hash-max-ziplist-value 64 使用ziplist时值的最大长度,值长度超过此数使用hashtable

    4、set

    set在redis中有两种编码类型:intset和hashtable

    类型使用条件

    intset:存储的值为 -2^63~2^63-1 之间的整数

    hashtable:非intset的其他情况

    编码转换
    # 插入不符合intset条件的值
    >> sadd test -9223372036854775808  # -2^63
    >> object encoding test
    "intset"
    >> sadd test -9223372036854775809
    >> object encoding test
    "hashtable"
    >> del test
    >> sadd test 9223372036854775807  # 2^63-1
    >> object encoding test
    "intset"
    >> sadd test 9223372036854775808
    >> object encoding test
    "hashtable"
    >> del test
    >> sadd test 1  # 插入非整数测试
    >> object encoding test
    "intset"
    >> sadd test a
    >> object encoding test
    "hashtable"
    >> del test
    
    # set-max-intset-entries  使用intset时元素最大数量
    >> config set set-max-intset-entries 3
    "OK"
    >> sadd test 1 2 3
    >> object encoding test
    "intset"
    >> sadd test 4
    >> object encoding test
    "hashtable"
    >> config set set-max-intset-entries 512
    >> del test
    
    相关参数
    参数项 默认值 说明
    set-max-intset-entries 512 使用intset时元素最大数量,超过此数量使用hashtable

    5、 zset

    zset在redis中有两种编码类型:ziplist和skiplist

    编码转换
    # zset-max-ziplist-entries 使用ziplist时值的最大数量
    >> config set zset-max-ziplist-entries 3
    "OK"
    >> zadd test 1 a 2 b 3 c
    >> object encoding test
    "ziplist"
    >> zadd test 4 d
    >> object encoding test
    "skiplist"
    >> config set zset-max-ziplist-entries 128
    >> del test
    
    # zset-max-ziplist-value 使用ziplist时值的最大长度
    >> config set zset-max-ziplist-value 8
    "OK"
    >> zadd test 1 abcdefgh # 长度8
    >> object encoding test
    "ziplist"
    >> zadd test 2 abcdefghi
    >> object encoding test
    "skiplist"
    >> config set zset-max-ziplist-value 64
    >> del test
    
    相关参数
    参数项 默认值 说明
    zset-max-ziplist-entries 128 使用ziplist时值的最大数量,超过此数量使用skiplist
    zset-max-ziplist-value 64 使用ziplist时值的最大长度,值长度超过此数使用skiplist

    相关文章

      网友评论

          本文标题:Redis数据结构底层编码转换

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