字符串对象 - 《Redis设计与实现》读书笔记
字符串对象的编码可以是int、raw和embstr
- 一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么用long类型的整数保存,即编码为int
- 一个字符串对象保存的是浮点数值,并且这个浮点数值可以用long double类型来表示,
那么用embstr编码的简单动态字符串(SDS) 或者 简单动态字符串(SDS)保存,即编码为embstr 或者 raw - 一个字符串对象保存的是字符串值,并且这个字符串值的长度 > 39 byte,那么用简单动态字符串(SDS)保存,即编码为raw
- 一个字符串对象保存的是字符串值,并且这个字符串值的长度 <= 39 byte,那么用embstr编码的简单动态字符串(SDS)保存,即编码为embstr
使用embstr编码的字符串对象来保存短字符串值的好处
- embstr编码将创建字符串对象所需的 内存分配次数 从raw编码的 2次 降低为 1次
- embstr编码将释放字符串对象所需的 内存释放函数 从raw编码的 2次 降低为 1次
- 因为embstr编码的字符串对象的所有数据都保存在一块连续的内存里面,所以embstr编码的字符串对象能够更好地利用缓存的优势
编码的转换
int编码的字符串对象和embstr编码的字符串对象在条件满足的情况下,会被转换为raw编码的字符串对象
-
对于int编码的字符串对象来说,如果我们向对象执行了一些命令,
使得这个对象保存的不再是整数值,而是一个字符串值,
那么字符串对象的编码将从int变为raw,比如append命令 -
对于embstr编码的字符串对象来说,embstr编码的字符串对象实际上是只读的,
当对embstr编码的字符串对象执行 任何修改命令 时,那么字符串对象的编码将从embstr变为raw
源码阅读
- 文件:src/t_string.c
只言片语任我说,提笔句句无需忖。落笔不知寄何人,唯有邀友共斟酌。