Redis 动态字符串数据结构

2022-03-04 15:06:09 浏览数 (1)

redis字符串类型的数据结构如下

代码语言:javascript复制
struct sds{
    //空余字节数
    int free=0
    //保存的字符串的长度
    int len=5
    //保存的字符串的字节数组
    byte[] buf
}

redis作为缓存数据库要求数据的读写速度快,当redis的字符串增加或者修改时,会对对应的字符串进行内存重分配,与c语言不同的是redis采用了 空间预分配 和 惰性空间释放的两种策略

当sds中的字符串的长度增加时,字符串增加了字符

代码语言:javascript复制
redis //原来buf存入的字符串, 要变成redisTemplate
//需要给buf分配7个字节保存,此时结构体变化为
struct sds{
    //空余字节数
    int free=13
    //保存的字符串的长度
    int len=13
    //保存的字符串的字节数组
    byte[] buf
}

可以看到此时空余的字节数为13byte,所以此时当redisTemplate -> redisTemplateImpl, 变化之后结构体为

代码语言:javascript复制
struct sds{
    //空余字节数
    int free=9
    //保存的字符串的长度
    int len=17
    //保存的字符串的字节数组
    byte[] buf
}

这种方式很好的解决了每次更新都需要空间重分配的操作,提高了数据处理速度

当空间减少时,字符串执行减少字符的操作

此时字符串为redisTemplate

代码语言:javascript复制
struct sds{
    //空余字节数
    int free=0
    //保存的字符串的长度
    int len=13
    //保存的字符串的字节数组
    byte[] buf
}

当redisTemplate -> redisTemp

代码语言:javascript复制
struct sds{
    //空余字节数
    int free=4
    //保存的字符串的长度
    int len=9
    //保存的字符串的字节数组
    byte[] buf
}

当redisTemp -> redisT

代码语言:javascript复制
struct sds{
    //空余字节数
    int free=7
    //保存的字符串的长度
    int len=6
    //保存的字符串的字节数组
    byte[] buf
}

当下次操作再进行添加时,可以使用free的字节数,进行操作

0 人点赞