Redis持久化

介绍

持久化技术就是将瞬时数据(不如内存中的数据)转化为持久化数据(比如硬盘中的数据)。Redis支持两种方式的持久化,RDB方式和AOF方式,前者会按照指定的规则定时将内存中的数据存储在硬盘中,后者会将执行的命令记录下来,存储在命令中。

RDB持久化

RDB持久化就是通过快照完成的,当符合一定条件的时候(可以通过参数配置)Redis会自动将内存的数据生成一份副本并存储在硬盘中,这个过程称为快照,Redis会在以下几种情况对数据进行快照

  • 根据参数配置进行自动快照
  • 执行SAVE或BGSAVE
  • 执行FLUSHALL
  • 执行复制(replication)

根据参数配置进行自动持久化

参数配置可以在redis.conf中进行查看或修改

save 60 10000表示的是在60秒内如果有10000个键发生改变,则自动触发快照。触发条件可写多条,从下至上依次判断是否触发。
与RDB有关的配置项还有
stop-writes-on-bgsave-error yes#如果在进行RDB快照的时发生存储错误,Redis是否停止写操作
rdbcompression yes#是否对快照文件进行LZF压缩
rdbchecksum yes#存储和加载快照文件的时候是否进行校验
dbfilename dump.rdb#快照文件名字
dir ./#快照文件所在目录,相对于redis.conf文件

如果想检验RDB快照功能,可以通过Redis提供的redis-benchmark进行测试。redis-benchmark -h hostname -p port -n requests

执行SAVE或BGSAVE

执行SAVE或BGSAVE命令,都可以触发Redis进行快照操作
1)SAVE在执行快照操作的过程中会阻塞Redis主进程,需要等RDB执行完成后才会执行来自客户端的命令
2)执行BGSAVE命令后,服务器会立即返回ok,然后fork一个子进程,然后专门来执行RDB操作,不会阻塞从所有来自客户端的命令

执行FLUSHALL

当执行FLUSHALL命令时,Redis会清空数据库中的所有数据,只有redis.conf中的快照触发条件不会空,就一定会触发快照操作,不管当前条件是否满足触发条件。

执行复制(replication)

当设置主从复制的时候,Redis会在复制初始化时进行自动快照,同时即使没有定义自动快照条件或没有手动快照操作,也会生成RDB快照文件。

AOF持久化

默认情况下Redis是没有开启AOF(append only file)持久化的,可以在redis.conf中开启,同时也可以在redis.conf中选择AOF的模式

appendonly no#是否开启AOF持久化
appendfilename appendonly.aof#文件名
AOF不需要指定目录,RDB和AOF的保存目录是相同的,通过dir来设置
appendfsync always#每有一条命令执行,就同步到AOF文件,安全但速度慢
appendfsync everysec#每秒同步一次到AOF文件
appendfsync no#写入工作交给操作系,由操作系统判断缓冲区大小,统一写入到AOF文件,同步频率低但速度快
与AOF有关的配置项还有
no-appendfsync-on-rewrite no#正在导出RDB快照的过程中,是否停止AOF同步
auto-aof-rewrite-percentage 100#当AOF文件比起上次重写,文件大小增长了100%,执行重写
auto-aof-rewrite-min-size 64mb#当AOF文件超过了64MB,执行重写
aof-load-truncated yes#Redis在启动的时候可以加载被截断的AOF文件

AOF重写

AOF文件通过同步 Redis服务器所执行的命令,从而实现了数据库状态的记录,但是,这种同步方式会造成一个问题: 随着运行时间的流逝,AOF 文件会变得越来越大。为了解决这个的问题,Redis 需要对AOF文件进行重写(rewrite):创建一个新的AOF文件来代替原有的AOF文件,新AOF文件和原有AOF文件保存的数据库状态完全一样,但新AOF文件的体积小于等于原有AOF文件的体积。

手动触发AOF重写BGREWRITEAOF

在平常的使用中如果误操作了FLUSHALL, 应立即SHUTDOWN NOSAVE,并关闭服务器,然后手动编辑AOF文件,去掉文件中的FLUSHALL相关行, 然后开启服务器,然后就可以导入回原来数据。但是如果FLUSHALL后,恰好触发了AOF的重写机制,那么数据就彻底丢失了
为了避免这种误操作的发生,在线上环境中应该禁用掉FLUSHALLFLUSHDB
在redis.conf中写入
rename-command FLUSHALL ""
rename-command FLUSHDB ""
然后重启Redis

posted @ 2016-03-09 10:32  我不是黄海滨  阅读(313)  评论(0编辑  收藏  举报