redis基本知识

来源:互联网 发布:mysql 查看版本号 编辑:程序博客网 时间:2024/06/03 23:03

SDS字符串的优点:

  1. 杜绝缓冲区溢出
    在C语言中,新增字符串都会假设存储的长度能足够的容纳新增的字符串,然而新增长度一旦超过了存储的长度,就会存在缓冲区溢出,使得新增的字符串被截取,导致新增字符串内容丢失。
  2. 减少修改字符串时带来的内存重分配次数
    C语言中,字符串本身并不记录自身的长度,而字符串的底层实现总是一个N+1的字符串长度,所以在每次新增和缩短一个字符串时,都需要对内存重新分配。而SDS字符串本身用len属性记录了字符串的长度,在新增时,会预留存储字符串那么大的空间,下次新增时先判断预留的空间是否能够容纳新增字符串,能够新增则直接新增,不能够容纳则为其分配,而删除字符串时,删除的空间先通过SDS字符中的free属性保存,留于新增操作运用。SDS通过未使用空间,实现了空间预分配和惰性空间释放两种优化策略。

1. ## 空间预分配 ##
它主要是用于优化SDS字符串增长操作:当SDS进行修改,并且需要对SDS空间进行扩展的时候,程序不但会对SDS分配修改所需要的空间,并会对SDS分配额外的未使用的空间。
分配的原则:

  • 分配SDS长度小于1MB:程序会分配和未使用空间相同大小的空间,即len和free的值相同。如:修改后SDS的len将变为13字节,那么程序则会分配13个字节,SDS的buf数组实际长度为13+13+1=27(1为结束’\0’)
  • 分配SDS长度大于1MB:程序会分配1MB的未使用空间,即free为1MB。如修改后SDS长度为30MB,则SDS长度为30MB+1MB+1byte。

    2. ## 惰性空间释放 ##
    它主要是运用于优化SDS字符串缩短操作:SDS要缩短保存SDS时,程序并不立刻使用内存重新分配要回收缩短后多出来的字节空间,而是使用free属性将这些数量记录起来,等待将来使用。