redis-数据库
2019-01-06 本文已影响0人
黑金星
struct redisServer
{
// 一个数组,保存着服务器中所有数据库
redisDb *db;
// 服务器的数据库数量
int dbnum;
//...
};
dbnum默认值为16.
1. 数据库键空间
redis是一个键值对数据库服务器,每个数据库有一个redisDb结构来表示,其中的dict字典保存了数据库中的所有键值对,我们称这个字典为键空间。
typedef struct redisDb
{
// ...
// 数据库键空间,保存着数据库中所有键值对
dict *dict;
// 过期字典,保存着键的过期时间
dict *expires;
// ...
} redisDb;
数据库键空间例子
数据库键空间例子.png
2.键的过期时间
typedef struct redisDb
{
// ...
// 过期字典,保存着键的过期时间
dict *expires;
// ...
} redisDb;
带有过期字典的数据库例子如下图。
带有过期字典的数据库例子.png
2.1 过期键删除策略
删除有定时删除(过期立马删除,使用redis的时间事件),惰性删除,定期删除是那种策略。
redis采用惰性删除和定期删除两种策略。
- 惰性删除:当执行所有读写数据库的命令时,在执行之前都会调用expireIfNeeded函数检查是否键过期,如果过期则键删除,否则不做动作。再执行实际命令。
- 定期删除:由activeExpireCycle函数实现,被redis的serverCron函数调用。工作模式:在规定时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。他会继续接着上次停止的数据库+1(比如上次查到10号数据库停了,下次从11开始)开始查找,对所有数据库一直做一个轮询查找删除。
2.2 RDB与过期键
在执行save或者bgsave命令时,过期键不会被保存。载入RDB文件时,如果是从服务器模式,不论是否过期,都会载入;如果是主服务器时,程序会对键检查,过期不会被载入。
2.3 AOF与过期键
当键过期了,但还没被删除,AOF不会额外处理。当过期键被删除时,程序会显式向AOF文件追加一条DEL命令。AOF重写时,程序会检查,已过期的不会保存到重写后的AOF文件中。
2.4 复制与过期键
当服务器运行在复制模式下,从服务器的过期删除动作由主服务器控制:
- 主服务器在删除过期键后,会显式向所有从服务器发送一个del命令。
- 从服务器执行读命令时,即使碰到过期键也不会删除,当做啥事没发生。
- 从服务器只有收到主服务器的del命令,才会删除过期键。
这是为了保证主从服务器数据的一致性。
3.数据库通知
两类通知:键空间通知(某个键执行了什么命令),键事件通知(某个命令被什么键执行了)。