Redis数据结构—字符串

Redis数据结构—字符串

  • Redis数据结构—字符串
    • 1 通过len可以o1复杂度获取字符串大小
    • 2 可以以二进制的形式存储任意数据
    • 3 sds的api是安全的,不会照成缓冲区溢出和内存泄漏
    • 4 sds可以减少内存分配的次数,从必定n次到最多n次
    • 5 重用c语言

Redis数据结构—字符串

redis是用c语言写的,一个内存key~value数据库,常用作缓存。redis的字符串类型叫做简单动态字符串simple dynamic string。结构主要包括三部分,int len,int free, char[] buf。len表示buf中字节数组长度,free表示还有多少字节可以用,buf存储字节数组,最后一个是终止字符"\0",表示当前的内容。他和普通的c字符串相比有几个好处:

1 通过len可以o1复杂度获取字符串大小

通过len可以o1复杂度获取字符串大小,而普通的c字符串需要遍及数据直到空字符串,也叫终止字符串,时间复杂度是o(n)。所以strlen方法复杂度是o(1)。

2 可以以二进制的形式存储任意数据

普通的c字符串不能存储空格等特殊字符串,如果包含了终止字符,后续的字符就会截断,而sds存储用的是字节数组,并且有len来表示数据长度

3 sds的api是安全的,不会照成缓冲区溢出和内存泄漏

内存泄漏是在截断字符串的时候,如果内存没有手动释放,就会泄漏。sds的api自动帮我们做了内存释放和获取的操作,我们不需要关心。

4 sds可以减少内存分配的次数,从必定n次到最多n次

如果在concat的时候,会有两种内存分配策略,增加的时候有内存预分配策略;减少的时候先不释放,只是把free增加,这样如果下次操作是增加就可能不需要分配了。
预分配策略,先增加必须的内存,然后如果增加后的len大于等于1mB,那么free等于1MB;如果增加后len小于1MB,那么free等于len。

5 重用c语言库的部分代码

你可能感兴趣的:(Redis设计与实现)