redis为什么要自己实现SDS表示字符串

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。redis为什么要自己实现SDS表示字符串,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1:redis是一种kv的存储结构,它的key是字符串类型,它的值也是支持字符串的,所以字符串在redis中最常见的类型,redis资深是通过c语言实现的,但是它并没有直接使用c语言中的字符数组的方式来实现字符串,而是自己实现了一个sds,既简单动态字符串。

2:原因:c语言中的字符串是实现方式,字符串是通过字符数组实现的,底层开辟了一块连续的空间,依次存放字符串中的每一个字符,为了表示这个字符串的结束,会在字符数组的最后一个字符处记录\0,当识别到字符串数组当中的\0的这个字符的时候,会认为字符串结束了。

会带来一些问题:

①这样实现字符串不能保存任意的内容,至少\0这个字符是不行的,因为一旦遇到这个字符的时候,字符串就直接被截断了,这种在redis当中是肯定受不了的。

②c语言当中的字符串是以\0作为识别字符串结束的方式,所以当我们要判断字符串的长度,以及对字符串追加等操作的时候,都需要从头开始去遍历,一直遍历到\0的时候在返回长度或者做追加,这样使得字符串的相关操作效率都比较低。

解决方法:在用字符数组表示字符串的同时,在这个字符串中增加两个字段,一个表示分配给该字符数组的总长度alloc字段,还有一个是表示字符串现有长度的len字段,这样在获取长度的时候就不会依赖\0了,直接返回len的值就可以了,还有就是当我们做追加操作的时候,只需要判断追加的部分的len加上已有的字符串的len字段的长度,是否大于alloc,如果超过就重新申请空间,如果没有超过,直接在后面去追加就可以了。

基于以上的设计,redis当中的其它操作比如复制,比较等等,都可以用类似的方式,非常高效的进行操作。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/160686.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!