Redis系列之持久化机制RDB和AOF
Redis的数据是保存在内存中的,如果每次关闭或者机器断电,就会出现数据丢失,所以需要进行持久化保存处理
Redis进行持久化保存的方式主要有两种:RDB和AOF,在redis官网也有进行介绍: https://redis.io/docs/manual/persistence/
RDB,Redis Database快照,是Redis默认的持久化方案。当满足一定条件的时候,会把当前内存中的数据写到磁盘,生成一个快照文件,默认的文件名为dump.rdb
可以在redis.conf配置RDB文件的文件名和路径
# The filename where to dump the DB
dbfilename dump.rdb
# 文件路径
dir ./
自动触发
配置触发
# 在redis.conf配置,配置300s检查一次,至少有1个key被修改就触发
save 300 10
shutdown关闭触发
在redis执行shutdown正常关闭的时候会去持久化数据到磁盘
flushall命令触发
清空数据操作会触发RDB操作,并且生成一个空的RDB文件,所以,如果没有开启其它持久化方式的时候,使用flushall是很危险的,在生产环境慎用
手动触发
redis-cli
使用save
和bgsave
命令
127.0.0.1:6379> save
OK
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379>
save和bgsave对比
命令 | save | bgsave |
---|---|---|
IO类型 | 同步 | 异步 |
阻塞 | 是 | 是(发生在fork) |
复杂度 | O(n) | O(n) |
消耗内存 | 不会消耗额外内存 | fork消耗内存 |
备份 | 主线程去进行备份,备份期间不会去处理其它的指令,其它指令必须等待 | 子线程去进行备份,其它指令正常执行 |
添加一些数据
127.0.0.1:6379>set k1 1
127.0.0.1:6379>set k2 2
127.0.0.1:6379>set k3 3
查询验证数据是否保存成功
127.0.0.1:6379>keys *
shutdown操作触发RDB进行快照
127.0.0.1:6379>shutdown
在redis目录里对dump.rdb文件进行备份,备份一份新的dump.rdb.backup
,然后重新启动redis
然后再来模拟一些删库跑路
127.0.0.1:6379>flushall
然后关闭redis服务端,再启动,发现数据已经丢失,要恢复数据,只能先删了dump.rdb,再将备份的dump.rdb.backup
改为dump.rdb,重启redis,发现数据已经恢复
由于RDB的数据安全性不是很好,所以redis又提供了另外一种持久化方案,AOF
AOF:Append Only File,顾名思义,就是一种追加文件的意思,工作机制比较好理解,redis会将每一个收到的写命令通过write函数追加到文件中,通俗理解就是日志记录
AOF机制默认是关闭的,你可以在配置文件中开启,找到redis.conf
# 默认是关闭的,可以进行开启
appendonly no
# The name of the append only file (default:"appendonly.aof")
appendfilename "appendonly.aof"
由于AOF是追加的形式,所以文件就会越来越大,越大的话,数据加载越慢,所以我们需要对AOF文件进行重写
以redis7之前的版本为例
什么时候重写?
需要配置文件redis.conf
# 配置达到百分比大小就触发重写
auto-aof-rewrite-percentage 100
# 配置达到文件大小就触发重写,就算达到第一个百分比大小,也必须大于64M才触发重写
auto-aof-rewrite-min-size 64mb
举例,在aof文件达到64mb的时候就重写1次,重写后的aof文件大小假如为50mb,上面第一个配置auto-aof-rewrite-percentage
为100,即aof文件到了100mb的时候,进行再次重写
优势
安全性高,就算是使用默认的持久化同步机制,也最多只会导致1s的数据丢失
AOF文件相对安全,AOF文件由于某些原因,比如磁盘满了等导致追加失败,也可以通过redis-check-aof
工具来修复
[root@localhost src]$ ./redis-check-aof --fix append
数据格式都是追加的日志,所以可读性更高
不足
看了上面的介绍,我们知道RDB和AOF两种方式各有优缺点,RDB会有数据丢失的风险,但是备份和恢复的速度很快,AOF虽然可以保证数据的一致性,但是恢复数据时候会很慢。
所以从Redis4.0之后加了一种混合RDB和AOF的模式,这种模式,前部分是使用RDB格式 作为全量备份,后面部分使用AOF追加的写命令数据作为增量备份
混合模式开启,在redis.conf里修改配置
aof-use-rdb-preamble yes