Redis持久化方式AOF和RDB
2017-12-04 15:50
936 查看
一谈到数据缓存,大家的脑海里面就会跳出Redis和Memcached。对于两者的比较在这里不展开详细分析,但是两者的最大区别在于Redis可以实现数据的持久化,并且提供更多的数据结构如list、set、hash等的存储。这里主要就Redis的两种持久化方式——AOF和RDB展开讨论。
配置文件默认设置了三个条件,save 、time、keynumbers,只要满足其中一个条件,redis就会执行快照。
可以知道,redis的rdb方式将数据持久化到了dump.rdb文件中。
当我们重启redis时,它会先去读取dump.rdb中的数据并且加载到内存中。
为了减少资源占用空间,rbd文件默认下是经过压缩的。
2.父进程继续和客户端打交道,处理数据;子进程将内存中的数据写入到硬盘中的一个临时文件中。
3.当子进程将内存中所有数据写入了临时文件后,会用该临时文件替换原来的rbd文件。此时,快照结束。
Ps:redis如果fork一份当前进程,那么就会使得fork出来的进程和主进程拥有一样的内存资源,因此,fork时必须保证系统有足够的内存,不然会启用虚拟村内,造成系统性能下降。
redis除了会自动执行快照,也可以执行手动快照。手动快照的命令为save和bgsave。从名字可以知道,bgsave是使用fork一份当前进程去执行快照任务的;而save则是使用当前主进程去执行快照,这时其他请求就会被阻塞,直到快照结束。
重写AOF文件:我们知道,如果记录下redis客户端的每一条记录会造成空间浪费,我们需要除数据的中间执行过程,保留最终数据命令即可。
手动重写:我们可以使用bgrewriteAOF命令优化AOF文件,去除数据中间执行过程的记录,从名字可以知道这也是使用fork当前进程去执行重写的任务。
自动重写:
问题:如果在重写AOF时,客户端又有新的命令进入会如何?
1.主进程fork一个子进程,用于执行aof重写。主进程会将新来的名字存在原aof文件和缓存中,这样做的目的是为了防止子进程重写失败;
2.子进程将原来的aof写入临时文件,写完以后,主进程也将缓存的命令也写入临时文件中。
3.将临时文件替换原aof文件。
auto-aof-rewrite-percentage 100:当前aof文件大小超过上一次重写时aof文件100%会执行重写。
auto-aof-rewrite-min-size 64mb:当前aof文件小于64mb时,不会进行重写。
appendfsync always:每操作一次就记录一次命令,这是最安全的方式,但也是最慢的。
appendfsync everysec:每过一秒记录一次,这是默认设定,兼顾安全与速度。
appendfsync no:不主动同步,又系统自己决定,这是最快但是是最不安全的。
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:不主动同步,又系统自己决定,这是最快但是是最不安全的。
相关文章推荐
- Redis 2种持久化方式( RDB、 AOF )配置
- redis的持久化(RDB和AOF方式)
- redis 两种持久化方式分析---rdb/aof
- redis学习笔记---redis的持久化(RDB和AOF方式)
- Redis存储方式RDB和AOF介绍及持久化的重要性
- Redis两种持久化方式rdb,aof
- Redis的2种持久化方式Snapshot(RDB)和Append-only file(AOF)的配置和对比
- redis 存储数据结构及持久化方式--rdb 、aof
- redis的持久化方式:RDB和AOF
- redis的持久化方式 RDB和AOF
- Redis支持的两种持久化备份方式(RDB & AOF)
- Redis持久化方式RDB和AOF
- redis的持久化方式RDB和AOF的区别
- Redis——持久化方式RDB和AOF的区别
- Redis详解之-事件订阅和持久化存储方式(RDB和AOF)(二)
- Redis——持久化方式RDB和AOF的区别
- redis的持久化(RDB和AOF方式)
- Redis持久化原理及配置详解(RDB方式和AOF方式)
- Redis两种持久化方式(RDB&AOF)
- Redis---redis的持久化(RDB和AOF方式)