redis底层实现的几种数据结构
redis底层数据结构 一、简单动态字符串(SDS) 定义: struct sdshdr{ int len; //SDS所保存的字符串长度 int free //记录buf数组中为使用的字节数量,预留内存长度 char buf[] //字节数组,用于保存字符串 } SDS与C字符串的区别及特点: 1)获取字符串长度: C字符串:遍历整个字符串,直至遇到结束符为止,复杂度为O(n)。 SDS:在len中记录了本身的长度,所以获取一个SDS长度的复杂度为O(1)。 2)杜绝缓存区溢出 C字符串:不记录本身的长度,当将一个字符串拼接到另一个字符串的末尾时,如果内存不够多的话,就会产生缓存区的溢出。 SDS:在进行拼接之前,会先检查给定的SDS空间是否足够,如果不够,会先扩展SDS的空间,然后才执行拼接操作。 3)减少内存重新分配次数 SDS:通过空间预分配额外空间作为保留使用,从而减少内存的重分配为题。 额外分配空间数量的公式: 1、当SDS的长度小于1MB的时候,分配与len属性的值相同长度的内存作为预存。(实际上所有的长度将多一字节保存空字符) 2、当SDS的长度大于等于1MB的时候,那么程序会分配1MB的未使用空间。 4)惰性空间释放 SDS的API需要缩短SDS保存的字符串时