底层:字符串

Posted shizhuoping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了底层:字符串相关的知识,希望对你有一定的参考价值。

底层:字符串

redis的字符串是一种SDS(simple dynamic string),类似ArrayList,有三个字段(大小、容量、标志位)和一个字符串组成,分配数组的长度和字符串的长度可以不同。

扩容

如果进行append操作数组就要进行扩容,如果字符串很大内存分配和复制开销就会很大。redis规定字符串最长不能超过512M,创建字符串时分配数组和实际长度相同,因为append大多数情况下不会发生。字符串在小于1M时,扩容加倍,大于1M后每次只加1M。

存储形式:emb和raw

字符串在长度很短时采用emb形式存储,字符串长度超过44字节(实际对象头+字符串共64字节)用raw形式存储。embstr它将redisobject对象头和SDS对象存在一块连续的空间,而raw对象头和字符串不在一起,如果对象头和字符串加起来超过64字节,redis认为它是大字符串(这个数字和内存分配整数倍有关),此时真正的字符串长度也就只有44字节(对象头占16字节,字符串中的长度、容量和标志位占3字节,64-16-3=44)。

对象头里面存储了数据类型、存储形式、LRU、引用计数和指向数据的指针。

对字段的优化

redis对内存优化是极致的,当字符串很短时,数组长度和实际长度字段会用byte和short类型来节省空间。

以上是关于底层:字符串的主要内容,如果未能解决你的问题,请参考以下文章

底层:字符串

Redis的五种数据结构及其底层实现原理

Redis底层数据结构之string

Redis底层数据结构

Redis底层解析字符串类型

Redis底层数据结构