缓存架构redis

redis对象之字符串对象

2018-11-10  本文已影响7人  0爱上1

承接上文redis对象

参考文献:黄健宏《Redis设计与实现》

前言

上文中描述了对象结构的几个属性,其中type表示redis五种对象类型,而encoding属性就是其对象类型的具体编码实现

字符串对象的编码实现可以是int,raw,embstr 三种,下面具体描述这三种编码实现的区别


编码实现方式

int

如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象就会将整数值保存在对象属性的ptr中,并经encoding属性设置为int

raw

如果一个字符串对象保存的是一个字符串值,并且该字符串的长度大于39字节,那么redis就会采用一个SDS来保存该字符串,并将encoding属性设置为raw

embstr

重点是embstr编码实现,如果一个字符串对象保存的是一个字符串值,并且该字符串值的长度小于等于39字节,那么redis会采用embstr编码的方式来保存这个字符串值

何为embstr?

embstr编码是一种专门用来保存短字符串的优化编码方式

至于为什么说是一种优化编码方式呢?因为和raw编码方式一样,embstr编码方式的实现也是使用redisObject对象接口以及sdshdr结构来表示字符串对象的,不同之处在于raw方式会调用两次内存分配来分别创建redisObject结构和sds结构,而embstr编码则通过调用一次内存分配函数来分配一块连续的内存空间,这个连续的内存空间中一次包含这两个结构

采用一次内存分配的好处?

既然embstr编码有这么多好处,那其缺点是什么呢?

缺点:

那么当我们对一个embstr编码的字符串进行修改时,redis是如何处理呢?


编码的转换

当我们对一个embstr编码的字符串对象进行修改时,redis会进行编码的转换

何为编码转换?


总结

上一篇 下一篇

猜你喜欢

热点阅读