Redis中string底层实现原理
1.前言
Redis是基于C语言进行开发的。Redis字符串并没有采取C语言字符串,而是基于简单动态字符串的抽象类型(SDS)。SDS是Redis为了提高字符串操作性能而设计的一种数据结构,相比于标准C语言中的字符串,SDS提供了更多特性和更高效的内存管理。
2.历史来源
C语言获取字符串长度是靠遍历。遍历整个字符串,遇到空字符就返回字符串的长度。这样就会有一个问题,如果遇到特殊的字符串,那么字符串长度就不完整,在某些场景下,字符串的意思就会改变。这在某些场景下是无法接受的。而SDS便不会有这种问题。
C语言获取字符串长度是遍历整个字符串,遇到空字符串就返回字符串的长度。这样在某些特殊字符串在进行获取长度的时候,返回的字符串长度就会错误。
2.字符串SDS结构:
struct sdshdr {// 记录 buf 数组中已占用空间的长度int len;// 记录 buf 数组中未使用空间的长度int free;// 实际存储数据的数组,以空字符结尾,但长度由 len 决定char buf[];
};
SDS结构的动态字符串字符串由三个属性组成:
1.字符串长度
2.数组中未使用的空间
3.实际存储的数组
3.SDS结构的优势:
1.二进制安全。使用len属性来记录字符串的长度,这样可以安全的存储二进制数据,包括null字符。
2.空间预分配。减少增加字符串需分配空间的次数。
3.惰性空间释放。缩短字符串的时候,Redis不会立即释放未使用的空间,可以避免重复的内存分配和释放操作。
4.减少修改字符串的开销。