1.redis持久化的方式
由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)
2.RDB和AOF的区别
2.1.1 RDB
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
2.1.2 RDB触发机制
save 同步阻塞进行数据的保存
bgsave 异步非阻塞进行数据的保存
自动
save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存 save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存 save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存
2.1.3 RDB的文件配置
dbfilename
设置快照的文件名,默认是 dump.rdb
dir
设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。默认是和当前配置文件保存在同一目录。
stop-writes-on-bgsave-error
默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了
rdbcompression
默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。
2.2 AOF
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
2.2.1 AOF配置的3种属性
always #每次有数据修改发生时都会写入AOF文件。
everysec #每秒钟同步一次,该策略为AOF的缺省策略。
no #从不同步。高效但是数据不会被持久化。
3种策略的对比:
2.2.2 AOF的重写
AOF的重写就是把过期的数据和之前没有用的命令进行简化和维护,且AOF重写并不需要对原有AOF文件进行任何的读取,写入,分析等操作,这个功能是通过读取服务器当前的数据库状态来实现的。这样不仅仅是减少磁盘的占用量.而且加速了数据的恢复速度.
实现AOF的重写有两种方式:
1.bgrewriteaof命令
2.AOF重写的配置
自动触发配置时,需要:
当前AOF文件的尺寸>AOF文件重写的最小尺寸;
(当前AOF文件的尺寸-AOF上次启动的尺寸)/AOF上次启动的尺寸>AOF文件增长率;
2.2.3 AOF的配置及说明
appendonly
开启aof特性,这个控制是否启用aof.
appendfilename
写入文件的文件名。开启aof之后,每条命令(除读之外的命令),均会写入到文件中,这里即实际写入的文件.
appendfsync
写入策略,默认值everysec,每秒写一次(调用flush)。另外两个值,always | no,分别表示每次redis写命令之外就写文件,和由操作系统保证。always对硬盘压力大,everysec是一个平衡值,no对硬盘压力最小,但调度由系统控制,丢失数据风险最大.
no-appendfsync-on-rewrite
是否在后台写时同步单写,默认值no(表示需要同步).这里的后台写,表示后台正在重写文件(包括bgsave和bgrewriteaof.bgrewriteaof网上很多资料都没有涉及到。其实关掉bgsave之后,主要的即是aof重写文件了).no表示新的主进程的set操作会被阻塞掉,而yes表示新的主进程的set不会被阻塞,待整个后台写完成之后再将这部分set操作同步到aof文件中。但这可能会存在数据丢失的风险(机率很小),如果对性能有要求,可以设置为yes,仅在后台写时会异步处理命令.
auto-aof-rewrite-percentage
aof文件增长比例,指当前aof文件比上次重写的增长比例大小。aof重写即在aof文件在一定大小之后,重新将整个内存写到aof文件当中,以反映最新的状态(相当于bgsave)。这样就避免了,aof文件过大而实际内存数据小的问题(频繁修改数据问题).
auto-aof-rewrite-min-size
aof文件重写最小的文件大小,即最开始aof文件必须要达到这个文件时才触发,后面的每次重写就不会根据这个变量了(根据上一次重写完成之后的大小).此变量仅初始化启动redis有效.如果是redis恢复时,则lastSize等于初始aof文件大小.
2.2.4 AOF的实际操作
1.开启appendonly
2.完后会在"/"目录创建appendonly.aof文件
3.vim appendonly.aof 文件,我们便看到了数据的写入
3.RDB和AOF的取舍
两者的比较: