Redis数据持久化

53 阅读3分钟

Redis持久化

RDB:Redis Database Backup file(Redis数据备份文件或Redis数据快照)。

  • 把内存中的所有数据都记录到磁盘中,当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。
### 主动备份
[root@localhost ~]# redis-cli
127.0.0.1:6379> save     #由Redis主进程来执行RDB,会阻塞所有命令
ok
127.0.0.1:6379> bgsave   #开启子进程执行RDB,避免主进程收到影响
Background saving started
### 自动备份:在redis.conf文件中,配置Redis内部的RDB触发机制。
# 900秒内,如果至少有1个key被修改,则执行bgsave
save 900 1
save 300 10
save 60 10000

RDB的执行原理?

  • bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据,完成fork后读取内存数据并写入RDB文件。
  • fork采用copy-on-write技术:
    • 当主进程执行读操作时,访问共享内存;
    • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

image.png

AOF:Append Only File(追加文件)

  • Redis处理的每一个写命令都会记录在AOF文件,可以看做命令日志文件。
  • AOF默认关闭,需要修改redis.conf配置文件来开启AOF。
# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"


# 表示每执行一次命令,立即记录到AOF文件
appendfsync always
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入AOF缓存区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
配置项刷盘时机优点缺点
Always同步刷盘可靠性高,几乎不丢数据性能影响大
everysec每秒刷盘性能适中最多丢失1秒数据
no操作系统控制性能最好可靠性较差,可能丢失大量数据
  • 因为是记录命令,AOF文件会比RDB文件大的多。
  • AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。
# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积多大以上才触发重写
auto-aof-rewrite-min-size 64mb

RDB和AOF的对比

  • RDB和AOF各有优缺点,如果对数据安全性要求较高,在实际开发中常常结合两者来使用。
RDBAOF
持久化方式定时对整个内存做快照记录每一次执行的命令
数据完整性不完整,两次备份之间会丢失相对完整,取决于刷盘策略
文件大小会有压缩,文件体积小(二进制文件)记录命令,文件体积大
宕机恢复速度很快
数据恢复优先级低,因为数据完整性不如AOF高,因为数据完整性更高
系统资源占用高,大量CPU和内存消耗低,主要是磁盘IO资源,但AOF重写时会占用大量CPU和内存资源
使用场景可以容忍数分钟的数据丢失,追求更快的启动速度对数据安全性要求较高