redis的5种基础数据结构(一): string(字符串)

1. 常见用途

缓存用户信息。
我们将用户信息结构使用JSON序列化成字符串,然后将序列化的字符串塞进redis来缓存。同样获取用户信息会经过一次反序列化的过程。

2.内部结构(扩容机制)

类似于Java的ArrayList,采用**预分配冗余空间**的方式来减少内存的频繁分配。
当字符串长度小于1M时,扩容都是加倍现有的空间。如果字符串长度大于1M时,扩容时一次只多扩容1M的空间。
字符串最大长度是512M。

3.数据结构

内部以字节数组的形式存在。
代码:
struct SDS<T> {
T capacity;// 数组容量
T len; // 数组长度
byte flags; //特殊标志位
byte[] content; //数组内容
}
capacity:表示所分配数组的长度,
len:表示字符串的实际长度

4.embstr 和 raw

在长度特别短时,使用embstr形式存储,而当长度超过44字节时,使用raw进行存储。

为什么是44字节?
要解决这个问题,首先要清楚redis的对象头结构。(具体的先不写了,对象头占有16个字节)
上述SDS结构体中,capacity,len,flags各占一个字节,总计3个字节
字符串要以null结尾,占用1个字节
因此,以上共计20字节。
回答问题:
1.内存分配器进行内存分配的时候,至少分配32字节的空间,如果字符串再稍微长点就是64字节空间。
2.如果字符串对象总体超过了64字节,redis就认为它是一个大字符串,不再适合embstr存储,而应该raw形式。
3.因此区分大小字符串的界限就是64字节的对象,然而,对象头,结构体等共占有20字节,实际上字符串的内容有64-20=44字节。
posted @ 2021-09-15 21:15  '蜗牛'  阅读(361)  评论(0)    收藏  举报