Redis的数据都是存储在内存中,为了数据的永久保存,需要把数据同步到硬盘上,这个过程就叫做持久化. Redis的持久化存在有两种方式: rdb方式,aof方式,这两种方式可以单独使用,也可以综合使用.
1.rdb持久化方式: 是在指定的时间间隔写入硬盘
2.aof持久化方式:是以日志,记录每一个操作,服务器启动后,根据日志来构建数据.
一、redis持久化之RDB方式
RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照(snapshot)。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。
1.执行时机
RDB持久化在四种情况下会执行
①:执行save命令。②:执行bgsave命令。③:Redis停机时。④:触发RDB条件时
1)save命令
执行下面的命令,可以立即执行一次RDB:
save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。
2)bgsave命令
下面的命令可以异步执行RDB:
这个命令执行后会开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响。
3)停机时
Redis停机时会执行一次save命令,实现RDB持久化。
4)触发RDB条件
Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:
# 900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB
save 900 1
save 300 10
save 60 100001) save 900 1 表示每900秒内至少有一个key发生变化,就持久化
2) save 300 10 表示每300秒内至少有10个key发生变化,就持久化
3) save 60 10000 表示每60秒至少有10000个key发生变化,就持久化
二、redis持久化之AOF方式
AOF: 以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来(不会记录读指令),只许追加文件但是不可以改写文件,redis启动之初会读取该文件(appendonly.aof)重新构建数据,换而言之:redis重启的话就是根据日志文件的内容将写指令从头到尾执行一次,以完成数据的恢复工作.
AOF方式,以日志记录每一个操作。Redis可以通过日志去还原数据。
优势: 安全性相对RDB方式高很多,它记录了每一个操作
劣势:效率相对于RDB方式低很多。
Redis默认是关闭AOF方式的
打开redis.config
appendonly no 默认关闭aof方式,我们修改为yes就开启
appendfilename 就是aof方式的日志文件
上图的配置是aof的三种同步策略:
always 同步持久化,每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
everysec 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
no 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
三、AOF重写机制
因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。
原理
AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。 AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似
触发条件
在 APPEND ONLY MODE模块下有两条默认配置:
这两条配置就是触发重写aof文件的条件,第一个表示文件大小达到前一次保存文件的一倍,第二个表示aof文件大小最少达到64MB,两个条件必须同时满足。
四、RDB与AOF对比
RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。