Redis源码阅读-字符串

技术干货,第一时间推送

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语言字符串有这样或那样的问题,例如获取长度性能不高,二进制不安全等,所以很多第三方库都是自己实现字符串结构。

-解读源码-

知其然并知其所以然

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200321A0QK8X00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券