Redis 学习 ---- 9.数据库

9.1 服务器中的数据库
所有数据库都保存在服务器状态redis.h/redisServer的db数组中

struct redisServer{
    redisDb *db; // 保存着服务器中所有数据库
    int dbnum;  // 数据库数量
}

9.2 切换数据库
typedef struct redisClient{
	redisDb *db; // 记录客户端当前正在使用的数据库
}redisClient;


9.3 数据库键空间
Redis是一个键值对数据库服务器,服务器中的每个数据库都由一个redis.h/redisDb结构表示
redisDb结构的dict字典保存了数据库中的所有键值对,将这个字典称为键空间(key space)

typedef struct redisDb{
	dict *dict; // 数据库键空间,保存着数据库中的所有键值对
}redisDb;

当使用Redis命令对数据库就行读写时,还会执行一些额外的维护操作:
Ⅰ当读取一个键之后(读操作和写操作都要对键进行读取),更新键空间命中次数和不命中次数
Ⅱ在读取一个键之后,更新LRU(最后一次使用)时间
Ⅲ读取键时发现键过期,服务器会删除这个过期键
Ⅳ如果有客户端使用WATCH监视了某个键,当键修改后,会标记这个键为脏
Ⅴ当服务器修改一个键后,都会对脏键计数器的值增1


9.4 设置键的生存时间或过期时间
Redis 学习 ---- 9.数据库_第1张图片

9.5 过期键删除策略
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,
如果过期的话删除该键;如果没有过期,就返回该键。
定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至少
要删除多少过期键,以及要检查多少个数据库,由算法决定。


9.9 重点回顾
①Redis服务器的素有数据库都保存在redisServer.db数组中,而数据库的数量则由redisServer.dbnum属性保存
②客户端通过修改目标数据库指针,让它指向redisServer.db数组中的不同元素来切换不同的数据库。
③数据库主要由dict和expires俩个字典构成,其中dict字典负责保存键值对,而expires字典则负责保存键的过期时间。
④因为数据库由字典构成,所有对数据库的操作都是建立在字典操作之上的。
⑤数据库的键重视一个字符串对象,而值则可以是任意一种Redis对象类型
⑥expires字典的键指向数据库中的某个键,而值则记录了数据库键的过期时间,过期时间是一个以毫秒为单位的UNIX时间戳。
⑦Redis使用惰性删除和定期删除俩种策略来删除过期的键:惰性删除策略只在碰到过期键时才进行删除操作,定期删除策略则每隔一段时间主动查找并删除过期键。
⑧执行SAVE命令或者BGSAVE命令所产生的新RDB文件不会包含已经过期的键。
⑨执行BGREWRITEAOF命令锁产生的重写AOF文件不会包含已经过期的键。
⑩当一个过期键被删除之后,服务器会追加一条DEL命令到现有AOF文件的末尾,显式地删除过期键。
十一、当主服务器删除一个过期键之后,它会向所有从服务器发送一条DEL命令,显式删除过期键。
十二、从服务器即使发现过期键也不会自作主张地删除它,而是等待主节点发来DEL命令,
十三、这种统一、中心化的过期键删除策略可以保证主从服务器数据的一致性。

十四、当Redis命令对数据库进行修改之后,服务器会根据配置向客户端发送数据库通知。

你可能感兴趣的:(Redis 学习 ---- 9.数据库)