1. 动态字符串
Redis 有 5 种基础数据结构,它们分别是:string(字符串)、list(列表)、hash(字典)、set(集合) 和 zset(有序集合)。
Redis中的字符串并不是传统的C语言字符串(即字符数组,以下简称C字符串),而是自己构建了一种简单动态字符串(simple dynamic string,SDS),并将 SDS 作为 Redis 的默认字符串表示。
Redis 相关的前置知识建议阅读作者的文章:Java工程师的进阶之路 Redis篇
在 Redis 中,C 字符串一般只用在无需对字符串值进行修改的地方,比如 Redis 的启动时的日志。Redis 需要的字符串是一个可修改字符长度的字符串,就会用到 SDS 来表示一个字符串。比如下面这个例子:
127.0.0.1:6379> set msg "hello world"
OK
这是一条很简单的命令,将 “hello world” 这个字符串与 msg 这个键建立映射关系。而 “hello world” 在Redis 中的表示,就是一个 SDS。说了那么久的 SDS,那这个 SDS 到底长什么样呢?我们来看看:
sds.h:
struct sdshdr {
// 记录buf数组中已使用字节的数量
// 等于SDS所保存字符串的长度
int len;
// 记录buf数组中尚未使用的字节数量
int free;
// 字节数组,用于保存字符串
char buf[];
};
下图展示了一个 SDS 的示例:
-
free 属性的值为 0,表示这个 SDS 没有任何剩余的可使用字节数; -
len 为 5,表示这个 SDS 保存了一个长度为 5 的字符串; -
buf 属性是一个 char 类型的数组,数组的前五个字节分别保存了 ‘R’、’e’、’d’、’i’、’s’ 五个字符,而 最后一个字节则保存空字符 ‘