Redis学习笔记(七) 数据库

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

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

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

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

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

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

 

 

 

 

redisBd结构的dict地点保存了数据库中的全部键值对,咱们将这个字典称为键空间。学习

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

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

 

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

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

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

三、若是服务器在读取一个键时发现该键已通过期,那么服务器会先删除这个过时键,而后再执行余下的操做。

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

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

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

 

设置过时时间

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

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

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

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

一、EXPIRE命令能够转换为 PEXPIRE命令

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

二、PEXPIRE命令转换为PEXPIREAT命令

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

三、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字典保存了数据库所在键的过时时间(过时字典),

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

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

 

过时删除策略

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

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

三、按期删除,每隔一段时间执行一次。

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

 

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

 

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

 

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

 

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

 

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

 


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

 

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