Redis学习与总结七:数据库

        Redis服务器将所有数据库都保存在服务器状态(redis.h/redisServer)结构的db数组中,每个Redis客户端都有自己的目标数据库,每当客户端执行数据库的读写命令时,目标数据库就会成为这些命令的操作对象。默认情况下,Redis客户端的目标数据库为0号数据库,但客户端可以通过执行Select命令来切换目标数据库。通过修改redisClient.db指针,让它指向服务器中的不同数据库,从而实现目标数据库的切换原理——这就是Select命令的实现原理

数据库键空间

        Redis是一个键值对数据库服务器,服务器中的每一个数据库都由一个redis.h/redisDb结构表示,其中redisDb结构中的dict字典保存了数据库中所有的键值对,我们就将这个字典成为键空间。

设置键的过期时间

EXPIREAT <key> <timestamp> 命令用于将键key的过期时间设置为timestamp所指定的秒数时间戳

PEXPIREAT <key> <timestamp> 命令用于将键key的过期时间设置为timestamp所指定的毫秒数时间戳

保存键的过期时间

redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典

移除过期时间

PERSIST命令可以移除一个键的过期时间

过期键的判定

(1)检查给定键是否存在于过期字典:如果存在,那么取得键的过期时间

(2)检查当前UNIX时间戳是否大于键的过期时间:如果是的话,键已经过期,否则的话,键未过期

计算并返回剩余生存时间

TTL命令以秒为单位返回键的剩余生存时间

过期键删除策略

定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。(对内存是最友好的,对CPU时间是最不友好的)

惰性删除:放任键过期不管,但每次从键空间获取键时,都检查取得的键是否过期,如果过期的话,就删除该键,如果没有过期的话,就返回该键。(对CPU时间是最友好的,对内存是最不友好的

定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键,至于要删除多少过期键,要检查多少个数据库,则由算法决定。(难点是确定删除操作执行的时长和频率)

Redis服务器实际使用的是惰性删除和定时删除两种策略:通过配合使用这两种删除策略,服务器可以很好的在合理使用CPU时间和避免浪费内存空间之间取得平衡。

总结

(1)Redis服务器的所有数据库都保存在db数组中,而数据库的数量则由redisServer.dbnum保存

(2)客户端通过修改目标数据库指针,让它指向redisServer.db数组中的不同元素来切换不同的数据库·

(3)数据库主要由dict和expires两个字典构成,其中dict字典负责保存键值对,而expires字典则负责保存键的过期时间

(4)因为数据库由字典构成,所以对数据库的操作都是建立在字典操作之上的。

(4)数据库的键总是一个字符串对象,而值则可以是任意一种Redis对象类型,包括字符串对象、哈希表对象、集合对象、列表对象和有序集合对象,分别对应字符串键、哈希表键、集合键、列表键、有序集合键。

(5)expires字典的键指向数据库中的某个键,而值则记录了数据库键的过期时间,过期时间是一个以毫秒为单位的UNIX时间戳。

(6)执行SAVE命令或者BGSAVE命令所产生的新RDB文件不会包含已过期的键。

(7)执行BGREWRITEAOF命令所产生的重写AOF文件不会包含已经过期的键。

(8)当一个过期键被删除以后,服务器会追加一条DEL命令,显示的删除过期键。

(9)当主服务器删除一个过期键之后,它会向所有从服务器发送一条EDL命令,显示的删除过期键。

(10)从服务器即使发现过期时键也不会自作主张的删除它,而是等待主节点发来DEL命令,这种统一、中心化的过期键策略可以保证主从服务器数据的一致性。

(11)当Redis命令对数据库修改之后,服务器会根据配置向客户端发送数据库通知。

猜你喜欢

转载自blog.csdn.net/qq_26891141/article/details/85088067