《Redis - 字符串对象》
一:概述
- Redis 源码版本为3.0.0.
- OBJECT ENCODING key 查看数据底层类型实现。
- 字符串最大字节为 512M.
二:总结
- 使用 String 时,如果字符串不超过 32 字节且需要变动字符串,则可以重建字符串。(如果修改的话会引起底层数据类型的变动)
二:字符串对象的底层实现
- 编码方式
- 字符串对象共有三种编码方式 int/raw/embstr
- 编码方式的选择
- 如果对象保存的是整数,并且可以用long类型表示,编码为 int
- 如果对象保存的是字符串,并且长度大于32字节,SDS保存,编码为 raw.(测试为35字节)
- 如果对象保存的是字符串,并且长度小于32字节, 编码为 embstr.
- embstr 编码方式
- 专门保存短字符串的一种优化编码方式。
- 和 SDS 一样,都是使用 redisObject 和 sdshdr 来表示字符串对象。
- 但是 raw 编码会调用两次内存分配来分别创建。
- embstr 只会调用一次(分配一块连续的内存)。
- 相比与 raw 格式
- embstr 内存分配次数更少。
- 释放内存更快。
- 更好的使用缓存。(连续内存)
- embstr保存图示
-
- raw保存图示
-
四:编码转换
- 转换方式
- int/embstr 编码会在某些条件下,转换为 raw 编码的字符串对象。
- 转换条件
- 如果对象执行了一些命令,使得这个对象存的不在是整数值,那么会从 int -> raw。
- Redis 没有为 embstr 的字符串编写任何修改程序,也可以说 embstr 编码是只读的。所以对 embstr 字符串修改是总会变成 raw 编码。
五:字符串命令的实现
-