一个单机的 Redis 服务器默认情况下有 16 个数据库(0-15 号),数据库的个数是可配置的。Redis 默认使用的是 0 号数据库,可以使用 SELECT 命令切换数据库。
    Redis 数据库结构 - 图1

    Redis 中的每个数据库都由一个 redis.h/redisDb 结构表示,它记录了单个 Redis 数据库的键空间、所有键的过期时间、处于阻塞状态和就绪状态的键、数据库编号等等。

    1. typedef struct redisDb {
    2. // 数据库键空间,保存着数据库中的所有键值对
    3. dict *dict;
    4. // 键的过期时间,字典的键为键,字典的值为过期事件 UNIX 时间戳
    5. dict *expires;
    6. // 正处于阻塞状态的键
    7. dict *blocking_keys;
    8. // 可以解除阻塞的键
    9. dict *ready_keys;
    10. // 正在被 WATCH 命令监视的键
    11. dict *watched_keys;
    12. struct evictionPoolEntry *eviction_pool;
    13. // 数据库编号
    14. int id;
    15. // 数据库的键的平均 TTL,统计信息
    16. long long avg_ttl;
    17. } redisDb;

    由于 Redis 是一个键值对数据库(key-value pairs database), 所以它的数据库本身也是一个字典,对应的结构正是 redisDb。其中,dict 指向的是一个记录键值对数据的字典,它的键是一个字符串对象,它的值则可以是字符串、列表、哈希表、集合和有序集合在内的任意一种 Redis 类型对象。expires 指向的是一个用于记录键的过期时间的字典,它的键为 dict 中的数据库键,它的值为这个数据库键的过期时间戳,这个值以 long long 类型表示。
    Redis 数据库结构 - 图2