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的字节数,进行操作