redis虽然是基于内存进行操作的一个数据库,但它也有将数据持久化到电脑磁盘上的能力
Redis的持久化有别于mysql这种数据库,它了实现⾼效的读写操作,并不会即时进⾏数据的持久化,⽽是按照⼀定的规则进⾏持久化操作的------持久化策略
Redis提供了2种持久化策略:
- RDB (Redis DataBase)
- AOF(Append Only File)
RDB-持久化
RDB:在满⾜特定的redis操作条件时,将内存中的数据以数据快照的形式存储到rdb⽂件中。Redis重启的时候,通过加载dump.rdb文件来恢复数据,从而达到数据持久化。
原理
RDB是redis默认的持久化策略
,当redis中的写操作达到指定的次数 、同时距离上⼀次持久化达到指定的时间 就会将redis内存中的数据⽣成数据快照,保存在指定的rdb⽂件中。
还需要注意的是,RDB每一次的数据快照
生成都是redis中的全部数据,且新的数据快照在保存到rdb文件时,会把原有的快照给覆盖。
其中的默认的规则的定义在redis.conf
配置文件中可以看到,我们也可以通过取消注释的方式并修改参数的方式进行自定义规则
shell
# You can set these explicitly by uncommenting the three following lines.
#
# save 3600 1
# save 300 100
# save 60 10000
默认触发持久化条件:
- 900s 1次:当操作次数达到1次,900s就会进⾏持久化
- 300s 10次:当操作次数达到10次,300s就会进⾏持久化
- 60s 10000次:当操作次数达到10000次,60s就会就⾏持久化
此外,我们还可以指定rdb数据存储的文件,同样在配置文件中redis.conf
可以找到
shell
# The filename where to dump the DB
dbfilename dump.rdb
最后,redis既然支持两种持久化策略,那么它们彼此肯定有类似开关的配置,来控制redis选择何种持久化策略
RDB持久化也是可以在配置文件中进行关闭的,将rdbcompression 后的yes改为no即可
shell
# Compress string objects using LZF when dump .rdb databases?
# By default compression is enabled as it's almost always a win.
# If you want to save some CPU in the saving child set it to 'no' but
# the dataset will likely be bigger if you have compressible values or keys.
rdbcompression yes
RDB优缺点分析
缺点
- 如果redis出现故障,存在数据丢失的⻛险,丢失上⼀次持久化之后的操作数据
- RDB采⽤的是数据快照形式进⾏持久化,不适合实时性持久化;
- 如果数据量巨⼤,在RDB持久化过程中⽣成数据快照的⼦进程执⾏时间过⻓,会导致redis卡顿,因此 save时间周期设置不宜过短;
优点
- 但是在数据量较⼩的情况下,执⾏速度⽐较快;
- 由于RDB是以数据快照的形式进⾏保存的,我们可以通过拷⻉rdb⽂件轻松实现redis数据移植
AOF-持久化
Apeend Only File,当达到设定触发条件时,将redis执⾏的写操作指令存储在aof⽂件中,从而达到数据持久化的目的。Redis中默认未开启aof持久化。
原理
Redis将每⼀个成功的写操作
写⼊到aof⽂件中,当redis重启的时候就执⾏aof⽂件中的指令,并将其应用到内存中从而恢复数据。
跟rdb持久化类似,它的一些设置也可以在配置文件redis.conf
中进行修改:
将appendonly
设置为 yes,则表示开启aof持久化。
shell
# AOF and RDB persistence can be enabled at the same time without problems.
# If the AOF is enabled on startup Redis will load the AOF, that is the file
# with the better durability guarantees.
#
# Please check https://redis.io/topics/persistence for more information.
# 开启aof持久化策略
appendonly no
同样,我们也可以指定aof数据存储的文件
shell
# The name of the append only file (default: "appendonly.aof")
## 设置 aof文件
appendfilename "appendonly.aof"
持久化策略同样可以在配置文件redis.conf
中找到并修改:
shell
# If unsure, use "everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
默认的触发条件是,每秒执行一次。另外2个分别是:
- appendfsync always:只要进⾏成功的写操作,就执⾏aof
- appendfsync no:让redis执⾏决定aof
AOF优缺点分析
aof存储的是指令,⽽且会对指令进⾏整理
;⽽RDB直接⽣成数据快照,在数据量不⼤时RDB⽐较快。
AOF策略记录每次对服务器进行写的操作,并将这些操作追加到文件末尾,以此来恢复原始数据。但是AOF文件有可能变得越来越大,为了降低存储开销和提高恢复速度,Redis提供了AOF重写功能。这个重写就是所谓的整理
。
它Redis的一种优化措施,它通过对AOF文件中的指令进行整理(例如合并相同的指令、消除重复的指令等),从而达到减少文件大小的目的。具体来说,Redis在执行AOF重写时,会创建一个新的临时文件,然后遍历现有的AOF文件,并根据一系列规则对其进行整理,最后将整理后的指令写入新的临时文件中,然后再替换原有的AOF文件。这样就可以有效地减少AOF文件的大小,提高恢复速度。
比如有两个操作,分别是set k1为k2,set k1为 k3,整理后 就会合并为一个set k1为k3
优点
- aof是对指令⽂件进⾏增量更新,更适合实时性持久化
- 跟RDB类似,可以通过拷⻉aof⽂件进⾏redis数据移植
缺点
- 由于它会记录每一次写操作,因此会对服务器的性能造成一定的影响;
- 由于它以文件的形式存储数据,因此在文件较大时,会导致服务器读取速度变慢;
总结
粗略的讲,RDB是选择了性能,但数据容易丢失,而AOF选择了保存数据,性能上不如RDB。
redis官⽅建议同时开启2中持久化策略,但如果同时存在aof⽂件和rdb⽂件的情况下恢复数据时,只会选择aof文件。
扩展
最后,在Redis4.0
之后,还提供了混合模式
,这种模式下RDB持久化的数据也会写进 appendonly.aof文件,而不是 dump.rdb 文件;而AOF持久化的命令也追加在 appendonly.aof 中RDB持久化的数据之后 也就是说,混合模式下 appendonly.aof 文件的前部分是 RDB的数据,后部分才是AOF的数据。
对应的开启同样也在配置文件redis.conf,但开启混合不仅需要开启混合开关,还需开启aof的持久化开关
shell
# 开启aof持久化策略
appendonly no
# When loading, Redis recognizes that the AOF file starts with the "REDIS"
# string and loads the prefixed RDB file, then continues loading the AOF
# tail.
aof-use-rdb-preamble yes
这样掉电恢复时,就变成了如下步骤:
- 首先读取 AOF 文件中的 RDB 部分,将其中的键值对加载到内存中
- 然后读取 AOF 文件中的 AOF 部分,按顺序执行其中的命令,更新内存中的数据