美文网首页
redis-数据库

redis-数据库

作者: 黑金星 | 来源:发表于2019-01-06 15:54 被阅读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.数据库通知

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

    相关文章

      网友评论

          本文标题:redis-数据库

          本文链接:https://www.haomeiwen.com/subject/ylunlqtx.html