![2f1b13311acb02adc6dcc6b30f9cddb5.png](https://i-blog.csdnimg.cn/blog_migrate/10ebaaf8f35478f9820382e40244bc58.jpeg)
Redis 内部针对 string提供了三种编码格式,分别是:int,embstr,raw
![8a64fae12e345b4ecf26084c6945506a.png](https://i-blog.csdnimg.cn/blog_migrate/3382f2261124641e4a9c13d09e5df1cb.png)
一、字符串编码选择流程
![3a393a3e4d6de4947a56c49e169dcee6.png](https://i-blog.csdnimg.cn/blog_migrate/5dca3b2bf66ed27ce1806e651acac99d.jpeg)
- int编码:8个字节的长整形,当数字长度小于20同时能够被强制转换成long long 类型使用 int编码,长度大于20,或者超出 long long 类型范围的时候会转换使用embstr
- embstr编码:小于等于44字节的字符串
- raw编码:大于44个字节的字符串
二、验证编码选择流程
![b85095cb0d75a4cd715b3e64a156b128.png](https://i-blog.csdnimg.cn/blog_migrate/35b2e8c300154cb4576e485343cc1f5d.jpeg)
2.1、int 编码验证
在 [-9223372036854775808,9223372036854775808] 范围内的数字使用的 int编码格式(闭区间)
左边负数阈值
127.0.0.1:6379> set age -9223372036854775808
127.0.0.1:6379> STRLEN age
(integer) 20
127.0.0.1:6379> OBJECT encoding age
"int"
# 超出阈值,使用 embstr
127.0.0.1:6379> set age -9223372036854775809
127.0.0.1:6379> STRLEN age
(integer) 20
127.0.0.1:6379> OBJECT encoding age
"embstr"
右边正数阈值
127.0.0.1:6379> set age 9223372036854775807
127.0.0.1:6379> STRLEN age
(integer) 19
127.0.0.1:6379> OBJECT encoding age
"int"
## 超出阈值,使用 embstr
127.0.0.1:6379> set age 9223372036854775808
127.0.0.1:6379> STRLEN age
(integer) 19
127.0.0.1:6379> OBJECT encoding age
"embstr"
"int"
2.2、embstr 验证
不符合 int编码标准,同时最大的字符长度小于等于 44字节,使用 embstr 编码格式。
127.0.0.1:6379> set age 11111111112222222222333333333344444444445555
OK
127.0.0.1:6379> STRLEN age
(integer) 44
127.0.0.1:6379> OBJECT encoding age
"embstr"
## 字符长度大于 44字节,使用 raw 编码格式
127.0.0.1:6379> set age 111111111122222222223333333333444444444455556
OK
127.0.0.1:6379> STRLEN age
(integer) 45
127.0.0.1:6379> OBJECT encoding age
"raw"
2.3、raw编码格式
字符长度大于 44字节的字符串,同时字符长度小于 512M
三、sds能够存储多大字符串
![618d6926a48c6965607ba66ce5482061.png](https://i-blog.csdnimg.cn/blog_migrate/b4ea970b38cc3c666cb0f2211a4be29c.jpeg)
以 sdshdr32 为例。
在 sds 结构定义中,alloc 是用来表示当前 sds 结构允许容纳的最大字符长度,sdshdr32 对应 alloc 的单位为 uintt32_t,而 uintt32_t 的取值范围是:0~2^32 = 4294967296
也就是说 sdshdr32 理论上允许存储的 char数组长度为 4294967296 ,而 一个 char 字符占用一个字节,换算后的单位如下:
![9aab2b4534a10f2f9250266902e0e78c.png](https://i-blog.csdnimg.cn/blog_migrate/e47254c764c15b49b5a7042a7c532462.jpeg)
也就是 sdshdr32 理论上允许存储4个G的数据,那 sdshdr64 理论值就更大了,不过也仅仅是理论值
Redis 在内部会存在一个上限值:512M,也就是一个字符串最大允许你存储 512M的字符串。
所以理论上 sds 结构能够存储的字符串很大,不过 Redis 对字符串做了限制,限制最大的字符串长度为512M。