本文主要是介绍【redis】字符串实现原理sds,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
redis 键值对中的key都是string类型的。redis内部实现中是怎么处理string呢?redis底层是用c写的,对于stirng并没有直接使用c的字符数组,而是自己封装了一个sds的类型。结构如下:
buf数组用于存真正的字符。
为什么要新建数据类型?必然是为了抽象,是的编程更加简单。原有的c的字符串的api是不安全的,因为在使用字符数组以后,需要跟踪内存的分配。在使用之前,需要预分配空间,否则会有缓冲区溢出(当然目前,一般的编译器都会用canary值来杜绝,编译时报一个错误)。用完一个字符串需要回收,否则会有内存泄漏。
为了使编程时尽可能少的考虑这些,就要把分配内存的事情封起来,不让调用方得知,这就是sds的作用。
每一次创建一个新的string时,不会按照实际大小分配,而是预分配更多的内存,当字符串截断时,也不是立刻回收内存,而是减少len值,增加free值。字符串插入时,先看free够不够,不够再分配。这样减少了内存分配回收的次数,效率更高。对应的策略叫做:空间预分配 和 惰性回收。
上图:
使用了以上sds数据类型,为编程带来的好处有三点:
(1)获取长度变为了O1的操作。
(2)杜绝了缓冲区溢出。
(3)减少了字符串改变造成的空间分配次数。
这篇关于【redis】字符串实现原理sds的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!