mixin

数据库

Redis 服务器对于他的使用方来说,主要的作用就是“非关系型数据库”、“键值数据库”,本章主要介绍了 Redis 作为一个数据库向使用方提供的接口,以及每种接口的具体实现方式。

数据的存储

Redis 服务器的所有数据库都保存在服务器状态结构 redis.h/redisServer 中:

1
2
3
4
5
struct redisServer {
  // ...
  redisDb *db;
  // ...
}

其中,db 是一个数组,在服务器初始化时决定创建的数量,默认值时 16。

数组的每一个元素都是 redis.h/redisDb 这个结构,该结构的核心字段是一个字典:

1
2
3
4
5
typedef struct redisDb {
  // ...
  dict *dict;
  // ...
} redisDb;

该字典存储了当前数据库的所有键值对,称之为键空间(key space),和用户所见的数据库是直接对应的:

  • 键空间的键:就是数据库的键,所有键都是一个字符串对象;
  • 键空间的值:就是数据库的值,每个值都可以是一个“字符串”、“列表”、“哈希表”、“集合”、“有序集合”这些在前面一个介绍过的对象中的任意一个;

SELECT 命令

SELECT 为选择数据库命令,Redis 客户端会维护这样一个结构:

1
2
3
4
5
typedef struct redisClient {
  // ...
  redisDb *db;
  // ...
}

db 字段会指向服务器中的数据库列表 redisServer.db 中的一个元素。

SELECT 命令执行时,对应的客户端结构会更新,db 指针将指向命令中指定的数据库下标。

SET 命令

最常见的命令,在使用 redis 时会在 set 后以不同前缀的形式,表示设置的不同数据结构类型。根据不同值类型执行的具体行为也不同,比如 hset 若提供了三个参数则会更新哈希对象的键值。

当原 key 存在或不存在时执行的行为不一样