Redis 中的字符串是可以修改的字符串,在内存中它是以字节数组的形式存在的。我们知道 C 语言里面的字符串标准形式是以 NULL(即 0x\0)作为结束符,但是在Redis 里面,字符串不是这么表示的。因为要获取以 NULL 结尾的字符串的长度使用的是 strlen 标准库函数,这个函数的算法复杂度是 0(n),它需要对字节数组进行遍历扫描,作为单线程的 Redis 表示承受不起。
Redis 的字符串叫 SDS,也就是 Simple Dynamic String。它的结构是一个带长度信息的字节数组。
struct SDS<T>
T capacity; //数组容量
T len; //数组长度
byte flags; //特殊标志位,不用理睬它
byte[]content; //数组内容
如代码所示,content里面存储了真正的字符串内容,那么中 capacity 和 len 表示什么意思呢?其有点类似于 Java 语言的 ArrayList 结构,需要比实际的内容长度多分配一些冗余空间。capacity 表示所分配数组的长度,len 表示字符串的实际长度。前面提到:字符串是可以修改的字符串,它要支持 append 操作。如果数组没有冗余空间,那么追加操作必然涉及分配新数组,然后将旧内容复制过来,再 append 新内容,如果字符串的长度非常长,内存的分配和复制开销就会非常大。
标签:capacity,Redis,len,详解,数组,字符串,长度 From: https://www.cnblogs.com/DCFV/p/18300207