这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战
12redis基本类型之字符串
字符串对象编码方式有int raw embstr
如果一个字符串对象保存的是整数值,整数值可以用long类型表示,那么编码方式就是int
如果字符串对象保存的是字符串值,字符串值长度小于等于32个字节,编码方式为embstr,大于32个字节,使用简单动态字符串来保存这个字符串值,编码方式为raw。
embstr和raw异同
embstr编码专门用来保存短字符串的一种优化编码方式,和raw编码一样,都是使用redisObject结构和sdshdr结构来表示字符串对象,raw调用两次内存分配,分别创建redisObject和sdshdr,embstr调用异常内存分配函数分配一块连续的空间,包含redisObject和sdshdr,释放内存的时候embstr也是调用一次,raw调用两次
如果使用long double类型表示的浮点数在redis中是作为字符串值来保存的。如果我们要保存一个浮点数到字符串对象里面,那么程序会将这个浮点数转换成字符串值,保存在字符串对象中。
可以用long类型保存的整数编码方式是int,浮点数为embstr或raw
编码的转换
int编码的字符串对象和embstr编码的字符串对象会被转换为raw编码的字符串对象
我们执行一些命令比如append命令,让int编码的字符串对象保存的不再是整数值,而是字符串,编码方式就会变成raw
embstr编码的字符串对象没有任何相应的修改程序,它是只读的,当我们执行修改命令的时候,编码方式就会由embstr转换成raw
常用命令
redis> SET key "value"
OK
redis> GET key
"value"
redis> EXISTS myphone # 确保 myphone 不存在
(integer) 0
redis> APPEND myphone "nokia" # 对不存在的 key 进行 APPEND ,等同于 SET myphone "nokia"
(integer) 5 # 字符长度
get命令对于int编码的实现方式是先拷贝对象所保存的整数值,将这个拷贝的对象转换成字符串值,然后向客户端返回这个字符串值。