Redis字符串对象

Redis自定义字符串:对于redis字符串没有理解过的可以去看看这个博文。

编码

字符串对象的编码有int、raw和embstr三种,编码决定了字符串对象的存储形式。编码其实和UTF-8、GBK这些都是一个意思。

Int

如果字符串对象保存的是整数值,并且这个正数值可以用long类型来表示,存储这个变量的字符串编码将设置为int。

Raw

如果字符串对象保存的是字符串值,并且字符串值的长度大于32字节,那么将使用Redis自定义的字符串格式存储,并且这个对象编码为raw。

Embstr

如果字符串对象保存的是字符串值,并且这个字符串值的长度小于等于32字节,那么将使用Redis自定义的字符串格式存储,并且这个对象编码为embstr。

Raw和embstr区别

1)embstr编码将创建字符串对象所需要的内存分配次数从raw编码的两次降为一次(创建一个字符对象需要分配redisObject和sdshdr两个内存空间)。

2)释放embstr编码的字符串对象只需要调用一次内存释放函数,而释放raw编码的字符串对象需要调用两次内存释放函数(这个释放次数和分配次数有关系)。

3)Embstr由于是一次分配内存,所以分配的两个内存地址是连续的,这对于raw编码的字符串对象能更好的利用缓存带来的优势。

数值类型

由于redis没有数值类型,所有的数值类型都是用字符串表示存储。在需要的时候redis会将字符串转化为数值类型操作后,在转化为字符串存储。

编码转换

Int编码的字符串和embstr编码的字符串对象在条件满足的情况下,会被转换为raw编码的字符串对象。

1)int编码的字符串如果执行某些命令后保存的不再是整数值,而是一个字符串值,那么字符串对象的编码将从int变为raw。例如3的int类型执行了拼接命令”ad”变为3ad后。

2)由于embstr编码的字符串对象没有任何的修改程序,所有embstr编码的字符串对象实际上是只读的。当对embstr编码的字符串对象执行修改命令的时候会转换为raw编码,但是变为raw编码执行完修改命令后,不会再变回为embstr编码。