04-Redis的内存对象及内部编码_String

2020-03-31  本文已影响0人  yakun0622

Redis支持5种对象类型,而每种都至少有两种编码,这样做的好处在于:

一方面接口与实现分离,当需要增加或改变内部编码时,用户使用不受影响;另一方面可以根据不同的应用场景切换内部编码,提高效率。

Redis各种对象类型支持的内部编码如下图所示(部分)

在这里插入图片描述

关于Redis内部编码的转换,都符合以下规律:编码转换在Redis写入数据时完成,且转换过程不可逆,只能从小内存编码向大内存编码转换。

字符串

1.1 概况
字符串是最基础的类型,因为所有的键都是字符串类型,且字符串之外的其他几种复杂类型的元素也是字符串。

字符串长度不能超过512MB。

1.2 内部编码
字符串类型的内部编码有3种,它们的应用场景如下:

127.0.0.1:6379> set key1 123
OK
127.0.0.1:6379> object encoding key1
"int"
127.0.0.1:6379> set key2 helloworld
OK
127.0.0.1:6379> object encoding key2
"embstr"
127.0.0.1:6379> set key2 helloworldhelloworldhelloworldhelloworld
OK
127.0.0.1:6379> strlen key2
(integer) 40
127.0.0.1:6379> object encoding key2
"embstr"
127.0.0.1:6379> set key3 helloworldhelloworldhelloworldhelloworldhell
OK
127.0.0.1:6379> strlen key3
(integer) 44
127.0.0.1:6379> object encoding key3
"embstr"
127.0.0.1:6379> set key4 helloworldhelloworldhelloworldhelloworldhello
OK
127.0.0.1:6379> strlen key4
(integer) 45
127.0.0.1:6379> object encoding key4
"raw"

1.3 编码转换
当int数据不再是整数,或大小超过了long的范围时,自动转化为raw。
而对于embstr,由于其实现是只读的,因此在对embstr对象进行修改时,都会先转化为raw再进行修改
因此,只要是修改embstr对象,修改后的对象一定是raw的,无论是否达到了44个字节。

127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> object encoding key1
"embstr"
127.0.0.1:6379> append key1 .world
(integer) 11
127.0.0.1:6379> get key1
"hello.world"
127.0.0.1:6379> object encoding key1
"raw"

参考链接:

https://blog.csdn.net/xsc_c/article/details/21176645

上一篇 下一篇

猜你喜欢

热点阅读