一、RDB持久化
RDB(Redis Backup File):把内存中的所有数据都记录到磁盘中,当Redis实例故障重启后,从磁盘读取快照文件,恢复数据
redis在正常停机之前会做一次持久化,但异常停机会导致数据丢失
手动命令
bash
#使用redis主进程把内存数据写入磁盘,此操作会阻塞所有命令
save
#另起一个子进程执行rdb,避免主进程受到影响
bgsave
写在redis.conf中redis自动执行
bash
#save 时间 key修改次数
#如果900秒内至少有1个key被修改,就拉起一个bgsave进程
save 900 1
#禁用RDB
save ""
#其他配置
#是否压缩数据文件,建议不开启,压缩会消耗cpu
rdbcompression yes
#RDB文件名称,修改名称后原名称将不会读取
dbfilename dump.rdb
#文件保存的路径目录
dir ./
bgsave执行步骤
① fork主进程得到子进程
② 子进程共享主进程的内存数据
③ 完成fork后读取内存数据并写入RDB文件
④使用新的RDB文件替换旧的RDB文件
fork采用的是copy-on-write技术
① 当主进程执行读操作时,访问共享内存
② 当主进程执行写操作时,则会拷贝一份数据,执行写操作
二、AOF持久化
AOF全称为Append Only File(追加文件),Redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件
bash
#是否开启AOF,默认为no,yes表示开启
appendonly yes
#AOF文件名称
appendfilename "appendonly.aof"
#配置AOF记录的频率,有三种方式
#每执行一次写命令就立刻记录到AOF文件(性能最好,消耗最大,几乎不会丢数据)
appendfsync always
#写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案(性能折中,1s内如果宕机数据会丢失)
appendfsync everysec
#写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
AOF记录的是操作记录,RDB记录的是值
因为是记录命令,AOF文件会比RDB文件大得多,而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义,通过执行bgwriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果
bash
bgrewriteaof
自动触发重写配置
bash
#默认值100 AOF文件比上次文件增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
#默认64mb AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb
三、混合持久化
在开启混合持久化的情况下,AOF 重写时会把 Redis 的持久化数据,以 RDB 的格式写入到 AOF 文件的开头,之后的数据再以 AOF 的格式化追加的文件的末尾
从AOF文件中查看到的就不是AOF标准格式的数据,因为其中混入的RDB格式的数据
redis5.0自动开启混合持久化
打开混合持久化:
bash
#redis-cli 查询是否打开了混合持久化
config get aof-use-rdb-preamble
#1.永久设置:在redis.conf设置
aof-use-rdb-preamble yes
#2.通过命令行开启,重启后生效
config set aof-use-rdb-preamble yes