redis持久化的问题

redis持久化的两种策略


RDB(redis database):在指定时间将内存中的快照(snapshot)写入到磁盘中进行持久化,恢复的时候直接将其读入到内存中。

怎么实现的:

redis单独fork一个线程出来,进行持久化,不会打扰主线程的高速运行,如果进行大规模的数据的恢复,同时对数据的丢失的敏感性不高的话,可以是使用该方法,不过只能恢复最新的备份的数据,会把最新备份之后的数据全部丢失

fork:复制一个完全一摸一样的线程,什么内存空间啥的都一样的线程,可能拖慢主线程的运行

dump.rdb:

什么时候触发保存:

1、900s内出现1次key的改动

2、300s内出现10次key的改动

3、60s内出现10000次key的改动

什么时候会触发dump

shatdown redis的时候,默认会去dump当前redis中的keys

禁用备份

在conf中写一个

save ""

如果要即时生效配置

set key value

save命令,即时生成dump.rdb

一些配置

stop-writes-on-bgsave-error:如果设置为yes,那么如果备份错误的时候,会拒绝写入的,如果设置为no,那么不会拒绝这些东西

rdbacompression:yes(设置为yes,redis会压缩整个dump文件,会耗cpu的资源)

rdbcchecknum:验证这个数据的准确性,会耗费cpu的10%的资源

两种备份方式

  1. save:啥都不管直接备份,系统不能响应set等命令了
  2. bgsave:redis新开一个线程在后台备份,不影响客户端的使用,lastsave获取上次备份时间

如何恢复:

将dump.rdb备份到相应的位置,重启redis服务即可

优势

1、大规模恢复

2、对数据的一致性完整性要求不高

劣势

1、备份的最后一次到redis down机的中间的数据就没有了,丢失了

2、fork一个线程进行备份的时候可能会出现性能的下降


 aop:append only file

是什么:

redis以日志的方式将所有的写操作记录下来,只需追加文件,不允许改写文件,redis启动之初就会根据这个文件重新构建一遍数据,redis会从头到尾执行一遍整个写操作

如果aof文件和dump文件共存的时候,首先加载aof文件

使用redis-check-aop可以fixaof文件的错误

三种同步策略:

1、always:每次数据改动都要同步到aof文件中,性能较差,数据完成性比较好

2、everysecs:每秒同步一次,如果出现问题,可能会丢失1s内的数据

3、no

rewrite(重写):aof文件随着文件越来越大,redis会启动文件的压缩,将一些命令合并起来,只保留恢复数据的最小的数据集,可以使用bgrewriteaof命令

重写机制:记录上一次aof文件的大小,这一次的大小是上次的两倍,同时大于64M

原文地址:https://www.cnblogs.com/zhangchiblog/p/11971860.html