底层:字符串
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类型来节省空间。
以上是关于底层:字符串的主要内容,如果未能解决你的问题,请参考以下文章