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会在结尾处额外分配一个字符'\0',不参与计算
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(额外的一字节为'\0');当下次再添加3个字符串时,free的长度符合要求,就不会触发扩容了。

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

2.2 懒释放

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

最新文章

  1. 解决Jenkins 2.0 初始化界面卡住的问题
  2. ubuntu搭建java开发环境
  3. ACM 找球号(一)
  4. MySQL查询今天/昨天/本周、上周、本月、上个月份数据的sql代码
  5. 第三章 数组与字符串 UVa1588 Kickdown
  6. 64 位win 7或windows 8下的visual studio不能连接Oracle数据库调试网站的问题
  7. 利用sql_trace跟踪一个指定会话的操作
  8. HDU 5294 Tricks Device (最短路,最大流)
  9. CodeForces 299B Ksusha the Squirrel
  10. 17.1.1.6 Creating a Data Snapshot Using Raw Data Files 创建一个数据快照使用 Raw Data Files
  11. Cocos2d-x游戏开发中的消息机制:CCNotificationCenter的使用
  12. Lazy evaluation
  13. table操作:边框-斑马线-多表头-焦点高亮-自动求和
  14. 3522: [Poi2014]Hotel( 树形dp )
  15. SORT函数的使用方法(转载)
  16. Project Euler:Product-sum numbers (problem 88) C++
  17. 【转】shell中如何判断一个变量是否为空
  18. Python 爬虫 之 阅读呼叫转移(一)
  19. OpenCV初步
  20. java----SAX解析XML

热门文章

  1. Python3.x:获取代理ip以及使用
  2. asp.net发送短信
  3. Python高级语法之:一篇文章了解yield与Generator生成器
  4. 如何用纯 CSS 创作气泡填色的按钮特效
  5. 手动加载B120i/B320i阵列卡驱动安装RHEL7.0
  6. Swift日常开发随笔
  7. 关于JavaScript对象中的一切(二) -- 继承
  8. spring junit4 测试
  9. 【目标检测】Cascade R-CNN 论文解析
  10. Typora 配置说明