Redis3.0 程序设计

41 阅读1分钟

前言

使用了Redis之后,对Redis内部实现感兴趣。Redis 5种数据类型分别是由什么数据结构实现的? 字符串数据类型既可以存储字符串,又可以存储整数和浮点数,甚至二进制位,那它Redis内部是怎么存储这些值的?一部分命令只能对特定数据类型执行,而另一部分命令却可以对所有数据类型执行,不同命令在执行时是如何进行类型检查的?Redis 内部是否实现了一个类型系统?是怎么存储各种不同数据类型的键值对的?过期Key又是如何实现自动删除的?

除了数据库之外,Redis还拥有发布与订阅、脚本、事务等特性,这些特性是如何实现的?

Redis使用什么模型或者模式来处理客户端的命令请求的?一条命令请求从发送到返回经历了什么?

简单动态字符串

没有使用C语言的字符串,而是自己构建了一种名为简单动态字符串的类型(SDS)。这样说,可能不理解。换句话说就是C语言的结构体:已使用的字节数组长度、未使用的字节数组长度、字节数组组成。

SDS的空间分配策略完全杜绝了发生缓冲区溢出的可能。Redis是作为数据库设计的,性能上考虑比较严格,我们知道频繁的修改数据,必然涉及到内存的分配和释放,这里未使用字节,就是为频繁分配和释放内存做的优化。