• Redis学习笔记(七) 数据库


    Redis 服务器将所有的数据库都保存在服务器状态redisServer结构的db数组中,db数组的每个项都是一个redisDB:

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

    dbnum:服务器初始化时,程序根据dbnum 来决定应创建多少少数据库,由服务器配置的database选项决定,默认16.

    在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前目标数据库,这个属性指向redisDb结构的指针:

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

    redisClient指针指向redisServer 数组的其中一个元素,而被指向的元素就是客户端的目标数据库。

    redisBd结构的dict地点保存了数据库中的所有键值对,我们将这个字典称为键空间。

    键空间的键也就是数据库的键,每个键都是一个字符串对象。

    键空间的值也是数据库的值,每个值可以是字符串对象、列表对象、哈希表对象、集合对象和有序集合对象中的任意一种Redis对象。

    Redis命令对数据库进行读写时,服务器不仅对键执行指定的读写操作,还会执行一些额外的维护工作:

    1、读取一个键后,服务器会根据键是否存在来更新服务器键空间命中次数或键空间不命中次数。

    2、读取一个键之后,服务器会更新键的LRU(最后一次使用时间),这个值用于计算键的空闲时间。

    3、如果服务器在读取一个键时发现该键已经过期,那么服务器会先删除这个过期键,然后再执行余下的操作。

    4、如果客户端使用Watch命令监视某个键,那么服务器再对被监视的键进行修改后,会将这个键标记为脏,从而让事务程序注意到这个键已经被修改过。

    5、服务器每次修改一个键之后,都会对脏键计数器的值加一,这个计数器会触发服务器的持久化以及赋值操作。

    6、如果服务器开启了数据库通知功能,那么在对键进行修改后,服务器将按配置发送相应的数据库通知。

    设置过期时间

    命令 EXPIRE key ttl 设置键生存时间为ttl秒

    命令 PEXPIRE  key ttl 设置键生存时间为ttl毫秒

    命令EXPIREAT key timestamp 命令 设置键key过期时间为timestamp秒数时间戳

    命令 PEXPIREAT key timestamp 设置键key过期时间为timestamp所指定的毫秒时间戳

    1、EXPIRE命令可以转换为 PEXPIRE命令

    def EXPIRE(key,ttl_in_sec);
    ttl_in_ms = sec_to_ms(ttl_in_sec)
    PEXPIRE(key,ttl_in_ms)

    2、PEXPIRE命令转换为PEXPIREAT命令

    def PEXPIRE(key,ttl_in_ms)
    now_ms = get_current_unix_timestamp_in_ms();
    PEXPIREAT(key,now_ms+ttl_in_ms)

    3、EXPIREAT命令转换为PEXPIREAT命令

    def EXPIREAT(key,expire_time_in_asc)
    expire_time_in_ms = sec_to_ms(expire_time_in_sec)
    PEXPIREAT(key,expire_time_in_ms)

    redisDB 结构的expires字典保存了数据库所在键的过期时间(过期字典),

    1、过期字典的键是一个指针指向键空间的某个键对象。

    2、过期字典的值是一个long类型的整数(毫秒精度的UNIX时间戳)。

    过期删除策略

    1、定时删除,在设置过期时间的同时,创建定时器,到期立即删除(内存友好,CPU不友好)。

    2、惰性删除,下一次查询时,查询是否过期,过期删除,(内存不友好,CPU友好)。

    3、定期删除,每隔一段时间执行一次。

    Redis的删除策略使用了 惰性删除和定期删除两种。

    在执行SAVE或者BGSAVE命令生成RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中,因此数据库包含过期键不会对新生成的RDB文件造成影响。

    在载入RDB文件时,如果服务器以主服务器模式运行,载入RDB文件时会对键进行检查,未过期的键加载到数据库中,过期键忽略。从服务器模式运行时,文件中保存的所有键被加载,主从同步时,从服务器过期键被清空。

    AOF文件写入时,如果过期键未清理,AOF文件不会因为过期键而产生影响,过期键被删除后,程序会向AOF文件追加DEL命令,来显示的记录该键已被删除。

    AOF重写时,程序会对数据库中的键检查,已过期的键不会被保存到重写后的AOF文件中。

    服务器在复制模式下,服务器的过期键由主服务器控制:主服务器在删除过期键后会向从服务器发送一条DEL命令,从服务在未收到命令前,客户端的读命令会像对未过期键处理方式一样,直到接到DEL命令,从过期键才会删除。


    每天学一点,总会有收获。

    说明:尊重作者知识产权,文中内容参考《Redis设计与实现》,仅在此做学习与大家分享。

  • 相关阅读:
    R语言:随机抽样(sample函数)
    SNP (Single Nucleotide Polymorphism), SNV ( single nucleotide variants ) , Indel (insertion-deletion) 的区别
    剑指offer五十六之删除链表中重复的结点
    剑指offer五十五之链表中环的入口结点
    剑指offer五十四之字符流中第一个不重复的字符
    剑指offer五十三之表示数值的字符串
    剑指offer五十二之正则表达式匹配
    剑指offer五十一之构建乘积数组
    求游戏晋级花费的宝石的期望
    剑指offer五十一之构建乘积数组
  • 原文地址:https://www.cnblogs.com/xtt321/p/12898645.html
Copyright © 2020-2023  润新知