Redis支持多个数据库,而且每一个数据库的数据是隔离的不能共享,而且基于单机才有,若是是集群就没有数据库的概念。 Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端能够指定将数据存储在哪一个字典中。这与咱们熟知的在一个关系数据库实例中能够建立多个数据库相似,因此能够将其中的每一个字典都理解成一个独立的数据库。html
每一个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(能够经过配置文件支持更多,无上限),能够经过配置databases来修改这一数字。客户端与Redis创建链接后会自动选择0号数据库,不过能够随时使用SELECT命令更换数据库,如要选择1号数据库:redis
redis> SELECT 1
OK
redis [1] > GET foo
(nil)
复制代码
Redis 是一个键值对(key-value pair)数据库服务器, 服务器中的每一个数据库都由一个 redis.h/redisDb 结构表示, 其中, redisDb 结构的 dict 字典保存了数据库中的全部键值对, 咱们将这个字典称为键空间(key space):数据库
typedef struct redisDb {
// ...
// 数据库键空间,保存着数据库中的全部键值对
dict *dict;
// ...
} redisDb;
复制代码
redisDb结构的expries字典保存了数据库全部的键过时时间,咱们称这个字典为过时字典: 过时字典的键是一个指针,这个指针指向键空间中的某个键对象(也便是某个数据库键)。 过时字典的值是一个 long类型的整数,这个整数保存饿键所指向的数据库键的过时时间,一个毫秒精度的UNIX时间戳。看下图是带有过时的时间的存储机构。其中过时字典的键实际上是一个指针,对应同一个内存存储。数组
过时键的删除策略是按期删除策略+惰性删除策略 惰性删除的策略以下图:bash
生成RDB文件,执行SAVE和BGSAVE命令时,程序会直接忽略过时的键。 载入RDD文件时 1.服务器以主服务器运行时,载入RDB会直接忽略过时的键 2.服务器以从服务器运行时,载入RDB不出来过时键,可是主同步的从服务器时,数据将 最终保存一致。 生成AOF文件时类型,AOF都是追加的命令,当过时时,会在AOF中追加DEL命令。当AOF重写时,是以数据当时的状态重写,则过时的键会直接被忽略。 复制时,主服务器会主动删除过时的数据,而后同步从服务器。从服务器只是读取。服务器
详情能够看命令 重点:函数