字符串作为redis最为核心,最为常用的数据类型,后面我们称sds,我们深入了解一下。
2.1. 字符串的数据结构:
我们从数据结构入手,猜测字符串实现的功能和特性,我们可以发现,这里相比于c字符串多了两个属性。free
和len
;
2.2. 剖析,length;
-
快速获取length :首先,leng最简单的效果便是可以直接获取redis字符串的长短,由于是直接获取属性,时间复杂度为O(1)。
-
二进制安全: 除了获取长度外,为了实现redis的sds可以存储任意数据的功能,sds通过length判断字符串是否到结尾,这和c字符串不同(‘/0’),因此可以存储任意二进制数据。
2.3. 剖析,free;
其实简单length之后发现基本功能都差不多了,那么这个free有什么作用呢?
- 预留free空间: 减少重新分配,在sds除了记录length之外,还会分配一倍length(1mb大小以内)的未使用空间,如果length在再次增加的情况下,不过增加的长度小于free,则不需要重新分配内存。
2.3. 使用c字符串函数;
redis虽然自行实现了字符串数据机构,但是还是在字符串末尾增加一个’/0’空字符,目的是为了使用c字符串的函数。