Redis持久化存储(RDB和AOF)

参考了: https://blog.csdn.net/canot/article/details/52886923  和 https://www.cnblogs.com/zhangchao-letv/articles/6122921.html 两篇文档

在看redis的事务处理的ACID属性,其中的一致性中提到了当Redis进程被终止:

如果Redis服务器进程在执行事务的过程中被其他进程终结,或者被管理员强制杀死,那么根据Redis所使用的持久化模式,可能出现以下情况:

  • 内存模式:如果Redis没有采取持久化机制,那么重启之后的数据库总是空白的,所以数据总是一致的。
  • RDB模式:在执行事务时,Redis不会中断事务去执行保存RDB的工作,只有在事务执行之后,保存RDB的工作才有可能开始,所以当RDB模式下的Redis服务器进程在事务中途被杀死时,事务内执行的命令,不管成功了多少,都不会被保存到RDB文件里。恢复数据库需要使用现在的RDB文件,而这个RDB文件的数据保存的是最后一次的数据库快照(snapshot),所以他的数据可能不是最新的,但只要RDB文件本身没有因为其他问题而出错,那么还原之后的数据库就是一致的。
  • AOF模式:因为保存AOF文件的工作在后台线程进行,所以即使是在事务执行的中途,保存AOF文件的工作也可以继续进行,因此,根据事务语句是否被写入并保存到AOF文件,会有以下两种情况:
    1. 如果事务语句未写入到AOF文件,或者AOF未被SYNC调用保存到磁盘,那么当进程被杀死之后,Redis可以根据最近一次成功保存到磁盘的AOF文件来还原数据库,只要AOF文件本身没有因为其他问题而出错,那么还原后的数据库总是一致的,但其中的数据不一定是最新的。
    2. 如果事务的部分被写入的AOF文件,并且AOF文件被成功保存,那么不完整的事务执行信息就会遗留在AOF文件里面,当重启Redis时,程序会检测到AOF文件并不完整,Redis会退出,并报告错误。需要使用Redis-check-aof工具将部分成功的事务命令移除之后,才能再次启动服务器。还原之后的数据总是一致的,而且数据也是最新的(知道事务执行之前为止)

RDB持久化既可以手动执行,也可以根据服务器配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中。
RDB 持久化功能所生成的RDB 文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB 文件时的数据库状态。

因为生成的RDB文件是保存在硬盘中的,所以当Redis进程退出,或者是Redis停机,但只要RDB文件存在,那么数据都可以还原状态。

Redis的RDB存储的优缺:

  • 优点:使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能 
  • 缺点:RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候

这里说的这个执行数据写入到临时文件的时间点是可以通过配置来自己确定的,通过配置redis在n秒内如果超过m个key被修改这执行一次RDB操作。这个操作就类似于在这个时间点来保存一次Redis的所有数据,一次快照数据。所有这个持久化方法也通常叫做snapshots。

配置文件在相应的redis.conf里

save 900 1    #在900s内超过1个key被修改
save 300 10   #在300s内超过10个key被修改
save 60 10000 #在60s内超过10000个key被修改 

snapshot出触发的时机,是有“间隔时间”和“变更次数”共同决定的,同时符合两个条件才能出发snapshot,否则“变更次数”会被继续累加到下一个的时间间隔上,snapshot过程中并不阻塞客户端请求。snapshot首先将数据写入临时文件,当成功结束后,将临时文件重名为dump.rdb。

RDB变更计数器:

除了saveparams数组之外,服务器状态还维持着一个dirty计数器,以及一个lastsave属性:

dirty计数器记录距离上一次成功执行SAVE命令或者BGSAVE命令之后,服务器对数据库状态(服务器中的所有数据库)进行了多少次修改(包括写入、删除、更新等操作)。
lastsave属性是一个UNIX时间戳,记录了服务器上一次成功执行SAVE命令或者BGSAVE命令的时间。

当服务器成功执行一个数据库修改命令之后,程序就会对dirty计数器进行更新:命令修改了多少次数据库.dirty计数器的值就增加多少。
例如,如果我们为一个字符串键设置值:

redis>SET message "hello"
OK

那么程序会将dirty计数器的值增加1。
又例如,如果我们向一个集合键增加三个新元素:

redis>SADD database Redis MongoDB MariaDB
(integer) 3




猜你喜欢

转载自www.cnblogs.com/chenyang920/p/9568093.html