• 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真正的释放内存空间,避免造成内存浪费。

  • 相关阅读:
    SQL Server和Oracle数据库索引介绍
    ITPUB上一个Oracle面试题
    国服《巫妖王之怒》3.35冰双持新手献礼指南
    WLK奥法输出循环
    flume架构初接触
    密码校验正则表达式(java 环境)
    初学Mahout测试kmeans算法
    身份证校验(java)
    gcc 中 O选项对空函数的优化
    《肖申克的救赎》语录
  • 原文地址:https://www.cnblogs.com/wwzyy/p/10599163.html
Copyright © 2020-2023  润新知