• Redis数据结构:SDS


    1. 简单动态字符串(simple dynamic string,SDS)是Redis的默认字符串表示结构,底层的string都是基于SDS实现。Redis基于C语言,并引用了部分C函数。

    使用场景:SET key  "hello"  或RPUSH list  "a" "b" "c" ,其中引号中的字符串就是SDS类型的

    数据结构:
    struct
    sdshdr { //buf中保存的字符串长度 int len; //buf中空闲空间长度 int free; //字符串数组,注意:buf会在结尾处额外分配一个字符'',不参与计算 char buf[]; };

    2. 动态扩容策略:

    在拼接一个字符串时,Redis会先检查是否有多余的空间,若不够会先扩容到符合【已有长度+新长度】,然后再拼接,并额外再分配相同大小的空间。

    2.1 预分配:

    1)如果对SDS进行修改之后,len如果小于1MB,那么程序也会分配和len相同大小的为使用空间,这时len=free。比如:SDS的len=5,free=0,当添加一个长度为3的字符串后,len=8,free=8,此时buf的长度为8+8+1(额外的一字节为'');当下次再添加3个字符串时,free的长度符合要求,就不会触发扩容了。

    2)如果len大于等于1MB,那么程序会额外分配1MB的空间。

    2.2 懒释放

    当减少一些字符串时,程序移除掉那些字符串后,空闲的空间不会立即回收,而是修改free记录一下大小,等下次再添加时,就可以直接使用空闲的空间了。SDS也提供了相应的API真正的释放内存空间,避免造成内存浪费。

  • 相关阅读:
    java内部类自我总结
    eclipse中调试第三方jar中的代码
    java提升性能的好习惯(转)
    WMI获取驱动版本
    cmd中的特殊符号
    DISM命令应用大全
    C#自检系统
    注册表检查
    PictrueBox 显示Resources里面的图片
    Linq to XML
  • 原文地址:https://www.cnblogs.com/wwzyy/p/10599163.html
Copyright © 2020-2023  润新知