开发者社区> 问答> 正文

为什么用SDS结构体来在Redis底层使用C语言实现?

已解决

为什么用SDS结构体来在Redis底层使用C语言实现?

展开
收起
游客lmkkns5ck6auu 2022-10-11 20:26:10 475 0
1 条回答
写回答
取消 提交回答
  • 推荐回答

    Redis SDS实现了空间预分配和惰性空间释放两种策略。

    a)如果SDS修改后,SDS长度(len的值)将于1mb,那么会分配与len相同大小的未使用空间,此时len与free值相同。例如,修改之后字符串长度为100字节,那么会给分配100字节的未使用空间。最终SDS空间实际为100+100+1(保存空字符'\0');

    b)如果大于等于1mb,每次给分配1mb未使用空间惰性空间释放:对字符串进行缩短操作时,程序不立即使用内存重新分配来回收缩短后多余的字节,而是使用free属性将这些字节的数量记录下来,等待后续使用(SDS也提供API,我们可以手动触发字符串缩短);

    c)二进制安全:因为C字符串以空字符作为字符串结束的标识,而对于一些二进制文件(如图片等),内容可能包括空字符串,因此C字符串无法正确存取;而所有SDS的API都是以处理二进制的方式来处理buf里面的元素,并且SDS不是以空字符串来判断是否结束,而是以len属性表示的长度来判断字符串是否结束;

    d)遵从每个字符串都是以空字符串结尾的惯例,这样可以重用C语言库<string.h>中的一部分函数。以上内容摘自《阿里开发者手册-Redis专题》电子书,点击https://developer.aliyun.com/ebook/download/7770 可下载完整版

    2022-10-12 23:29:23
    赞同 展开评论 打赏
来源圈子
更多
收录在圈子:
阿里云开发者社区官方技术圈,用户产品功能发布、用户反馈收集等。
问答排行榜
最热
最新

相关电子书

更多
ApsaraDB for Redis——与创客同行 立即下载
微博的Redis定制之路 立即下载
云数据库Redis版的开源之路 立即下载