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

Redis持久化方式AOF和RDB

2017-12-04 15:50 936 查看
一谈到数据缓存,大家的脑海里面就会跳出Redis和Memcached。对于两者的比较在这里不展开详细分析,但是两者的最大区别在于Redis可以实现数据的持久化,并且提供更多的数据结构如list、set、hash等的存储。这里主要就Redis的两种持久化方式——AOF和RDB展开讨论。

1.1RDB

RDB是Redis默认的持久化方式,它是通过快照方式完成的,当符合一定条件时,Redis会将内存中的数据进行快照,并且保存到磁盘中。我们可以通过修改Redis的配置文件来设置我们需要的快照条件。我们打开配置文件:

#
#   save ""

save 900 1
save 300 10
save 60 10000

# By default Redis will stop accepting writes if RDB snapshots are enabled
# (at least one save point) and the latest background save failed.


配置文件默认设置了三个条件,save 、time、keynumbers,只要满足其中一个条件,redis就会执行快照。

save 900 1//900秒钟至少有1个key被修改就执行快照
save 300 10//300秒钟至少有10个key被修改就执行快照
save 60 10000//60秒钟至少有10000个key被修改就执行快照


1.2 rbd文件

使用RDB方式持久化数据,那么数据存放在哪里呢?看看我们的redis配置文件:

# The filename where to dump the DB
dbfilename dump.rdb //快照文件

# The working directory.
#
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir ./ //存储路径


可以知道,redis的rdb方式将数据持久化到了dump.rdb文件中。

当我们重启redis时,它会先去读取dump.rdb中的数据并且加载到内存中。

为了减少资源占用空间,rbd文件默认下是经过压缩的。

# the dataset will likely be bigger if you have
rdbcompression yes //默认开启压缩

# Since version 5 of RDB a CRC64 checksum is placed at the end of the file.


1.3执行快照过程

1.当需要快照时,redis会使用fork函数,复制一份当前的进程作为子进程。

2.父进程继续和客户端打交道,处理数据;子进程将内存中的数据写入到硬盘中的一个临时文件中。

3.当子进程将内存中所有数据写入了临时文件后,会用该临时文件替换原来的rbd文件。此时,快照结束。

Ps:redis如果fork一份当前进程,那么就会使得fork出来的进程和主进程拥有一样的内存资源,因此,fork时必须保证系统有足够的内存,不然会启用虚拟村内,造成系统性能下降。

redis除了会自动执行快照,也可以执行手动快照。手动快照的命令为save和bgsave。从名字可以知道,bgsave是使用fork一份当前进程去执行快照任务的;而save则是使用当前主进程去执行快照,这时其他请求就会被阻塞,直到快照结束。

2 AOF

redis另一种持久化策略是AOF,它是将发送到redis客户端的每一条记录保存下来并且持久化到硬盘中的AOF文件中,和dump.rdb文件的作用类似,我们可以通过修改配置文件appendfilename来修改aof文件名。

#
a7e7
The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"

# The fsync() call tells the Operating System to actually write data on disk


重写AOF文件:我们知道,如果记录下redis客户端的每一条记录会造成空间浪费,我们需要除数据的中间执行过程,保留最终数据命令即可。

手动重写:我们可以使用bgrewriteAOF命令优化AOF文件,去除数据中间执行过程的记录,从名字可以知道这也是使用fork当前进程去执行重写的任务。

自动重写

问题:如果在重写AOF时,客户端又有新的命令进入会如何?

1.主进程fork一个子进程,用于执行aof重写。主进程会将新来的名字存在原aof文件和缓存中,这样做的目的是为了防止子进程重写失败;

2.子进程将原来的aof写入临时文件,写完以后,主进程也将缓存的命令也写入临时文件中。

3.将临时文件替换原aof文件。

# Specify a percentage of zero in order to disable the
# rewrite feature.

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# An AOF file may be found to be truncated at the end
# startup process, when the AOF data gets loaded back into


auto-aof-rewrite-percentage 100:当前aof文件大小超过上一次重写时aof文件100%会执行重写。

auto-aof-rewrite-min-size 64mb:当前aof文件小于64mb时,不会进行重写。

AOF文件同步策略

AOF文件同步策略三种,满足不同的需求,三种策略如下所示:

# appendfsync always
appendfsync everysec
# appendfsync no


appendfsync always:每操作一次就记录一次命令,这是最安全的方式,但也是最慢的。

appendfsync everysec:每过一秒记录一次,这是默认设定,兼顾安全与速度。

appendfsync no:不主动同步,又系统自己决定,这是最快但是是最不安全的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: