您的位置:首页 > 数据库 > Redis

Redis持久化

2016-03-09 10:32 483 查看

介绍

持久化技术就是将瞬时数据(不如内存中的数据)转化为持久化数据(比如硬盘中的数据)。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的重写机制,那么数据就彻底丢失了

为了避免这种误操作的发生,在线上环境中应该禁用掉
FLUSHALL
FLUSHDB


在redis.conf中写入

rename-command FLUSHALL ""


rename-command FLUSHDB ""


然后重启Redis

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: