Redis内部数据结构

Redis和其他key-value数据库的很大区别是它支持非字符串类型的value值。它支持的value值的类型如下:

  1. sds (simple dynamic string) 简单动态字符串
  2. 双端链表
  3. 字典(dictionary/map/associative array)
  4. 跳跃表(skiplist)

下面将对以上的各个类型在redis内部的实现进行分析。

一、sds (simple dynamic string) 简单动态字符串

Redis并没有使用C的字符串,而是在其上面进行了封装,以适应更多频繁的耗时操作。在前面的内容中,我们一直将sds 作为一种抽象数据结构来说明,实际上,它的实现由以下两部分组成:

 typedef char *sds;
 struct sdshdr {
// buf 已占用长度
int len;
// buf 剩余可用长度
int free;
// 实际保存字符串数据的地方
char buf[];
};

这样的设计对于strlen()和append()操作来说是效率很高的。对于strlen()操作来说,很明显可以通过len属性在O(1)的时间内拿到。对于append()操作,参考下面的例子:

redis> SET msg "hello world"
OK
redis> APPEND msg " again!"
(integer)
redis> GET msg
"hello world again!"

看看这个过程中sdshdr的变化情况:

首先,set msg后,sdshdr如下:

 struct sdshdr {
len = ;
free = ;
buf = "hello world\0";
}

然后,append msg后,sdshdr如下:

 struct sdshdr {
len = ;
free = ;
// 空白的地方为预分配空间,共18 + 18 + 1 个字节
buf = "hello world again!\0 ";
}

可以看到,Redis的sds会预分配2倍自己大小的空间,这样就减少了内存的追加操作,即减少了字符串追加操作的时间。

最新文章

  1. Windows建立Cucumber和Ruby测试环境
  2. Git--分布式版本控制系统
  3. qt中添加Q_OBJECT报错的问题
  4. Oracle注入漏洞
  5. 苹果试图做?XCode6 放弃prefix.pch档
  6. Nginx的HTTP模块
  7. Swift - 使用NSUserDefaults来进行本地数据存储
  8. sql性能
  9. 分析$.isPlainObject
  10. ADO.NET 防止SQL注入
  11. nodejs模块学习: connect解析
  12. linux内核中访问共享资源
  13. 3.HttpSession
  14. String与StringBuffer
  15. Java之指定Junit测试方法的执行顺序举例
  16. BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流
  17. mariadb的flashback到底怎么样???防误删可以,但算不上真正的闪回--再看mariadb 10.3的System-Versioned Tables
  18. Watto and Mechanism CodeForces - 514C (字典树,哈希)
  19. CentOS7.x编译安装nginx,实现HTTP2
  20. perl解析xml-XML::Simple/XMLin

热门文章

  1. 贪心+数学【p3156】 [CQOI2011]分金币 ([HAOI2008]糖果传递)
  2. java有自动垃圾回收机制
  3. 收纳箱1号 | GitHub Pages部署静态网页的一点私货
  4. Chrome插件开发教程收集
  5. Visio整体移动
  6. 【spring data jpa】【mybatis】通过反射实现 更新/保存 实体的任意字段的操作
  7. JAVA常见算法题(十三)
  8. 3、列表 list
  9. Vue表单和组件
  10. [Java] 实验8