1、Redis的SDS
redis中使用的默认字符串与c语言默认使用的不太一样,C语言使用空字符结尾,Redis自己封装了一种简单的动态字符串(simple dynamic string,SDS)。在源代码sds.h中可以找到SDS的定义(本文参考3.0.0版,3.2.0之后会有变化),如下所示:
1 //sds.h 2 struct sdshdr { 3 unsigned int len; 4 unsigned int free; 5 char buf[]; 6 };
可以用下图来说明一下:
len值为5:表示该SDS有5个字符,
free值为0:表示该SDS没有分配任何多余的空间
buf是一个char类型的数组。前面存储len个有效字符。
SDS也遵循字符串以'\0‘结束的习惯,最后的'\0’不计算在len内,完全由redis函数自己添加。因此,可以直接使用c的函数来处理该buf。
free值不为0时,'\0'的位置如下图所示:
2、SDS与C字符对比的优势
- len记录了字符的长度,因此可以以常数复杂度获取字符串长度,而普通的字符串需要经过遍历之后才能获取其长度。
- free记录了剩余空间,可以避免缓冲区溢出。C语言的字符串是可以直接追加的,默认假设有多余空间可以使用,一旦假设不成立,则会出现溢出。
- 通过预配内存,以及使用函数及时调整len和free,在free空间足够时,可以避免重新分配内存(申请内存是比较耗时的操作)。在减少字符串长度时也不必立即释放内存。
- 二进制安全:C字符串遇到空字符则认为已经结束,无法表示一些中间含有空字符的二进制数据,redis使用len记录长度,而不是空字符判断是否结束。redis不仅仅是用来保存字符串用的,可能用来存储图片,视频,压缩文件等二进制数据。
标签:SDS,redis,空字符,len,free,字符串 来源: https://www.cnblogs.com/williamzou/p/12101999.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。