Redis持久化

来源:互联网 发布:福州摩尔软件如何 编辑:程序博客网 时间:2024/05/29 09:56

Redis数据持久化通过两种方式RDB和AOF,RDB方式会根据配置的规则将内存中的数据持久化到硬盘上,AOF则是在每次执行写入命令后将其记录下来。


RDB方式,当符合某种规则时,会将内存中的数据生成一份副本存储到硬盘上,这个过程称为“快照”。Reids会在以下几种情况下对数据进行快照

  1. 根据配置规则进行自动快照;
快照的规则在配置文件中:
个快照条件独占一行,他们之间是或(||)关系,只要满足任意一个条件即可进行快照。
SAVE的第一个参数是是时间T,单位秒,第二个参数是更改的键的个数M,含义是当时间T内被更改的键的个数大于M时,自动进行快照。
2.用户执行SAVE/BGSAVE命令;
SAVE:当执行SAVE命令时,Redis同步进行快照操作,期间会阻塞所有来自客户端的请求,所以放数据库数据较多时,应该避免使用该命令;
BGSAVE:执行BGSAVE命令后Redis会马上返回OK表示开始进行快照操作,如果想知道快照操作是否已经完成,可以使用LASTSAVE命令返回最近一次成功执行快照的时候,返回结果是一个Unix时间戳。
3.执行FLUSHALL命令;
当执行FLUSHALL命令时,Redis会清除数据库中所有数据。不论清空数据库的过程是否触发 了自动快照的条件,只要自动快照条件不为空,Redis就会执行一次快照操作,当没有定义自动快照条件时,执行FLUSHALL命令不会进行快照操作。
4.执行replication时/
当设置了主从模式时,Redis会在复制初始化是进行自动快照。


快照原理
Redis默认会将快照文件存储在Redis当前进程的工作目录的dump.rdb文件中,可以通过配置文件中的dir和dbfilename两个参数分别指定快照文件的存储路径和文件名,例如:

快照执行的过程如下

Redis使用fork函数复制一份当前进程(父进程)的副本(子进程);
父进程继续处理来自客户端的请求,子进程开始将内存中的数据写入硬盘中的临时文件;
当子进程写完所有的数据后,用该临时文件替换旧的RDB文件,至此,一次快照操作完成。

Redis启动时会自动读取RDB快照文件,将数据从硬盘载入到内存,根据数量的不同,这个过程持续的时间也不尽相同,通常来讲,一个记录1000万个字符串类型键,大小为1GB的快照文件载入到内存需要20-30秒的时间。


AOF方式

在使用Redis存储非临时数据时,一般都需要打开AOF持久化来降低进程终止导致的数据丢失,AOF可以将Redis执行的每一条写命令追加到硬盘文件中,这已过程显然会降低Redis的性能,但是大部分情况下这个影响是可以接受的,另外,使用较快的硬盘能提高AOF的性能。


开启AOF
默认情况下,Redis没有开启AOF(append only file)持久化功能,可以通过在配置文件中作如下配置启用:
appendonly yes

开启之后,Redis每执行一条写命令就会将该命令写入硬盘中的AOF文件。AOF文件保存路径和RDB文件路径是一致的,都是通过dir参数配置,默认文件名是:appendonly.aof,可以通过配置appendonlyfilename参数修改,例如:

appendonlyfilename appendonly.aof



AOF文件重写

假设Redis执行了如下命令:

如果这所有的命令都写到AOF文件的话,将是一个比较蠢行为,因为前面两个命令会被第三个命令覆盖,所以AOF文件完全不需要保存前面两个文件,事实上Redis确实就是这么做的。删除AOF文件中无用的命令的过程成为”AOF重写”,AOF重写可以在配置文件中做相应的配置,当满足配置的条件时,自动进行AOF重写操作。配置如下:

第一行的意思是,目前的AOF文件的大小超过上一次重写时的AOF文件的百分之多少时再次进行重写,如果之前没有重写过,则以启动时AOF文件大小为依据。
第二行的意思是,当AOF文件的大小大于64MB时才进行重写,因为如果AOF文件本来就很小时,有几个无效的命令也是无伤大雅的事情。
这两个配置项通常一起使用。


同步硬盘数据

虽然每次执行更改数据库的内容时,AOF都会记录执行的命令,但是由于操作系统本身的硬盘缓存的缘故,AOF文件的内容并没有真正地写入硬盘,在默认情况下,操作系统会每隔30s将硬盘缓存中的数据同步到硬盘,但是为了防止系统异常退出而导致丢数据的情况发生,我们还可以在Redis的配置文件中配置这个同步的频率:

第一行表示每次AOF写入一个命令都会执行同步操作,这是最安全也是最慢的方式;
第二行表示每秒钟进行一次同步操作,一般来说使用这种方式已经足够;
第三行表示不主动进行同步操作,这是最不安全的方式。


原文链接:http://qifuguang.me/2015/10/13/Redis持久化


0 0
原创粉丝点击