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 复制与过期键

当服务器运行在复制模式下,从服务器的过期删除动作由主服务器控制:

这是为了保证主从服务器数据的一致性。

3.数据库通知

两类通知:键空间通知(某个键执行了什么命令),键事件通知(某个命令被什么键执行了)。

上一篇下一篇

猜你喜欢

热点阅读