Redis的持久化———《Redis的设计与实现》

1、键的生存时间或过期时间

2、RDB持久化

3、AOF持久化

Redis的持久化———《Redis的设计与实现》

(1) Redis有四个不同的命令可以用于设置键的生存时间或者过期时间,EXPIRE、PEXPIRE 、EXPIREAT和PEXPIREAT;前三个命令都是使用PEXPIREAT命令实现 ,无论客户端执行的是以上四个命令中的哪个,经过转换后,最终的执行效果都和执行PEXPIREAT命令一样

(2) TTL命令以秒为单位返回键的剩余生存时间,PTTL命令以毫秒为单位返回键的剩余生存时间;PERSIST命令可以移除一个键的过期时间;

(3) Redis的过期键删除策略:Redis服务器使用惰性删除和定期删除两种策略,使服务器在合理使用CPU时间和避免浪费内存空间之间取得平衡。

Redis的持久化———《Redis的设计与实现》

(1) RDB持久化通过保存数据库中的键值对来记录数据库状态。

(2) 有两个Redis命令用于生成RDB文件,SAVE和BGSAVE;SAVE命令会阻塞服务器进程,直到RDB文件生成完毕;BGSAVE会派生一个子进程,然后由子进程负责创建RDB文件,服务器进程继续处理命令;BGSAVE命令执行期间,客户端发送的SAVE命令和BGSAVE命令会被服务器拒绝,避免同时执行,产生竞争关系,以及客户端发送的BGREWWRITEAOF命令会被延迟到BGSAVE命令执行完毕之后执行。

(3) Redis允许通过设置服务器配置的save选项,让服务器在满足条件时执行BGSAVE命令;默认设置为(save 900 1 代表900秒内对数据库至少执行1次修改; sava 300 10 代表300秒内对数据库至少执行10次修改; save 60 10000 代表60秒内对数据库至少执行10000次修改),满足三个条件的其中一个即执行BGSAVE命令。

(4) AOF文件的更新频率通常比RDB文件的更新频率高,所以如果服务器开启了AOF持久化功能,服务器会优先使用AOF文件来还原数据库状态,只有在AOF持久化处于关闭状态,才会使用RDB文件来还原数据库状态。

Redis的持久化———《Redis的设计与实现》

(1) AOF持久化是通过保存被执行地写命令来记录数据库状态的

(2) AOF持久化功能的实现可以分为命令追加,文件写入和文件同步三个步骤;服务器执行完写命令之后追加AOF缓冲区末尾,然后根据appendfsync参数(默认是everysec)判断是否要将AOF缓冲区的内容写入和同步到AOF文件中。

(3) 当appendfsync的值为always时,服务器在每个事件循环都要将aof_buf缓冲区中的所有内容写入到AOF文件,并且同步AOF文件,所以always的效率是appendfsync选项三个值当中最慢的一个,但从安全性来说,always也是最安全的,因为即使出现故障停机,AOF持久化也只会丢失一个事件循环中所产生的命令数据;当appendfsync的值为everysec时,服务器在每个事件循环都要将aof_buf缓冲区中的所有内容写入到AOF文件,并且每隔一秒就要在子线程中对AOF文件进行一次同步。从效率上来讲,everysec模式足够快,并且就算出现故障停机,数据库也只丢失一秒钟的命令数据;当appendfsync的值为no时,服务器在每个事件循环都要将aof_buf缓冲区中的所有内容写入到AOF文件,至于何时对AOF文件进行同步,则由操作系统控制。因为处于no模式下无须执行同步操作,所以该模式下的AOF文件写入速度总是最快的,不过因为这种模式会在系统缓存中积累一段时间的写入数据,所以该模式的单次同步时长通常是三种模式中时间最长的。从平摊操作的角度来看,no模式和everysec模式的效率类似,当出现故障停机时,使用no模式的服务器将丢失上次同步AOF文件之后的所有写命令数据。

(4) AOF重写:解决AOF文件随着运行时间的流逝体积越来越大的问题;通过读取服务器当前的数据库状态来生成相对应的命令来实现。在AOF重写的子进程执行期间,服务器进程对于服务器接收的新的命令做以下三个工作处理:执行客户端发来的命令、将执行后的写命令追加到AOF缓冲区和将执行后的写命令追加到AOF重写缓冲区,子进程完成AOF重写工作之后,会像父进程发送一个信号,父进程在接到该信号之后,调用一个信号处理函数,并执行以下工作:将AOF重写缓冲区中的所有内容写入到新AOF文件中,这时新AOF文件所保存的数据库状态将和当前的服务器状态一致;并对新的AOF文件进行改名,原子地(atomic)覆盖现有的AOF文件,完成新旧两个AOF文件的替换。

                                                                      Redis的持久化———《Redis的设计与实现》

                                                分享大数据学习历程,坚持一周一篇原创,欢迎一起关注学习

                                                                           我现在坚持一定会有收获