技术干货,第一时间推送
23
目录:
1.概述
2.实现
3.操作
3.1.创建
3.2.销毁
3.3.查询基本信息
3.4.修改
3.5.扩容
3.6.拼接
3.7.拆分
3.8.映射
3.9.连接
4.总结
1.概述
字符串是一个无处不在的数据结构,C语言的原生字符串在一些些操作的性能和易用性上都有所欠缺,且非二进制安全。Redis中实现了一个简单易用的、高效的、二进制安全的字符串。
实现
所在文件:和。
只是的定义而已:
每个有个头部,头部存放字符串长度,空闲空间大小,实际字符串指针。
实际指向的是的地址,而且在每个字符串末尾会自动添加一个,所以可以用在所有的场合。需要的长度等信息时,通过向前偏移找到提取信息。字符串扩容时会分配超出实际大小的空间,多余空间通过记录。这样可以降低后面字符串的空间分配频次,提升效率。注意:没有算入和。
3.操作
会根据需要动态扩容,所以大部分修改的操作函数的返回值类型都是。
3.1.创建
可以以下几种方式创建:
以和指定一块内存
通过和创建一个。如果为,字符串内容以0填充。
以类型的参数
通过创建,长度通过获取。
不带参数创建空
创建一个空的字符串。
从已有的复制
复制一份。
以类型的参数
通过一个类型的值构造一个。
3.2.销毁
释放分配的空间。不能直接调用,因为指针前面还有头部信息。
3.3.查询基本信息获取字符串长度
调用获取实际长度(因为可能存入二进制,不能使用获取
获取空闲空间
调用获取空闲空间。
占用内存大小
调用获取分配的空间大小,包括头部,字符串长度,字符串末尾的,空闲空间长度。
3.4.修改
提供多种修改字符串修改操作。
更新长度
调用根据指向内容更新长度,以结尾。
这个方法主要用在手动修改内容时,更新信息。
上面例子中,如果没有调用,输出结果将会是6。
清空
调用清空的内容。
释放空闲空间
释放中空闲的空间。
增加/减少字符串长度
调用增加或减少字符串长度。
转换为小写
将中字符转为小写形式。
转换为大写
将中字符转为大写形式。
以和指定的内存覆盖
将以和指向的内存copy到中,覆盖现有内容。
以指定内容覆盖
将的内容copy到中,覆盖现有内容。
移除首尾指定字符
从左右删除中指定的字符。
保留指定范围
只保留中起始位置,结束位置之间的字符。位置可以为负数,表示从尾部开始计算。
3.5.扩容
可以动态扩容。当空闲空间不足以容纳操作所需时,会调用以下函数扩容:
分配空间,使中可以多容纳额外的个字符。
增加字符串长度,以0填充增加的部分。
3.6.拼接以和指定一块内存
将由和指定的内容拼接到现有字符串的后面。
以类型的参数
将拼接到现有字符串的后面。
拼接已有对象
将已有的一个拼接到另一个的后面。
以和指定的可变参数
将格式和指定的可变参数拼接到的后面。
以和指定的可变参数
通过格式将可变参数拼接到的后面。
以和指定的可变参数(redis自己实现的)
与功能类似,但是速度更快,只支持部分格式操作符。
3.7.拆分
以和分隔字符串,根据得到的每个子字符串创建sds数组并返回。
返回的数组需要调用释放:
3.8.连接
将字符串数组拼接成以分隔的一个。
3.9.映射
将在中的字符转为中的对应字符。
3.10.比较
使用比较两个内容。
4.总结
原生的C语言字符串有这样或那样的问题,例如获取长度性能不高,二进制不安全等,所以很多第三方库都是自己实现字符串结构。
-解读源码-
知其然并知其所以然
领取专属 10元无门槛券
私享最新 技术干货