首页 科技正文

上饶信息港:Redis学习条记(七) 数据库

admin 科技 2020-05-16 44 0

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设计与实现》,仅在此做学习与人人分享。

 

,

Sunbet

www.006yb.com是Sunbet公司指定亚洲官方直营现金网,官方授权,老品牌信誉有保障.Sunbet欢迎您加入我们。

版权声明

本文仅代表作者观点,
不代表本站Sunbet的立场。
本文系作者授权发表,未经许可,不得转载。

评论