1. RDB
RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。
Redis其实默认是会持久化的,即在你主动关闭Redis服务的时候,Redis会将数据保存为.rdb文件,但是如果Redis不是正常关机而是突然宕机,那么就不会触发RDB
那么如何手动来执行RDB呢?
save
save命令可以让Redis主进程来执行RDB,因为Redis是单线程的,此时主进程来执行RDB,其他的线程会被阻塞等待,这样的效果并不好。
bgsave
这个命令是单独启动一个子进程来实现RDB操作,不会影响主进程。
命令的结果是Background saving started 后台开启保存。这更适合Redis在运行中。
Redis内部有触发RDB的机制,在redis.conf中可以看到
第一行的含义是:3600s内,如果至少有一个key被修改,则执行bgsave,其余同理
但是如果save “” 开启后则表示禁用RDB,save “” 默认是被注释掉的
这个是代表RDB文件是否被压缩,默认是yes,但是不建议开启,因为会消耗cpu资源
这代表了RDB的文件名称
这表示了RDB文件的存储位置,默认是当前文件夹
RDB如何设置保存数据到RDB的频率呢?时间太短了例如save 1 1 这样会频繁的执行bgsave也会对性能产生开销,如果太长了例如 save 30 30 这样子如果Redis宕机了又会造成数据丢失。
总结:Redis默认是使用RDB的,但是是在关机后执行bgsave,我们也可以在自定义条件来触发RDB。
RDB的bgsave流程
当需要执行RDB时,子进程会fork主进程,主要的目的就是复制主进程的页表,因为在Redis操作内存时,不是直接操作物理内存,而是通过操作系统来进行操作物理内存,操作系统会分配一块虚拟内存来给Redis,虚拟内存和物理内存之间通过页面建立映射,这样子Redis就可以操作内存了,子进程fork主进程,主要的目的就是fork主进程的页表,拿着页表去进行RDB,那么在RDB时,主进程原来的内存空间不能进行写操作,主进程会复制一份数据到另一份内存空间,主进程的读写操作都在另一份内存空间中。
RDB的缺点:
- 会产生数据丢失
- RDB操作耗时
2. AOF
AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。
AOF文件的大小是逐渐增大的一个过程,Redis默认是不开启AOF的,需要在redis.conf文件中进行配置
appendonly默认为no,表示不开启AOF,需要将其改为yes来开启AOF
appendfilename表示AOF文件的名称
appendfsync有三个值
- always:表示每执行一次写命令,就将命令记录到AOF中
- everysec:写完命令先将命令放入到AOF缓冲区,然后每隔1s将缓冲区数据添加到AOF文件(默认方案)
- no:写完命令先将命令放入到AOF缓冲区,由操作系统来决定何时将缓冲区数据写入到AOF文件
appendfsync三种值的优缺点:
配置项 | 刷盘时机 | 优点 | 缺点 |
---|---|---|---|
always | 同步刷盘 | 可靠性高 | 性能开销大 |
everysec | 每秒刷盘 | 性能适中 | 最多丢失1s数据 |
no | 操作系统控制 | 性能最好 | 可靠性差,可能丢失大量数据 |
AOF的缺点:
- AOF因为记录了所有的命令,所以AOF文件的体积会很大
- 无效的指令:比如对一个key操作n次,前n-1次的命令都是无效的,又例如新增命令有100万条,后面直接执行一条删除命令,那么前面的所有指令都是无效的
AOF提供了bgrewriteaof命令会自动的优化AOF文件内的命令,尽可能用最少的命令来达到相同的效果
bgrewriteaof确实能够减少AOF文件的体积,但是什么时候去执行这个命令呢?
配置文件中有对bgrewriteaof触发的阈值
- 如果文件大小达到64mb会执行bgrewriteaof
- AOF文件相比上次执行bgrewriteaof时的文件大小增长超过了100%则会触发bgrewriteaof
RDB | AOF | |
---|---|---|
持久化方式 | 定时对内存做快照 | 记录每一次执行的命令 |
数据完整性 | 不完整,两次备份间会丢失数据 | 相对完整,依赖于刷盘策略 |
文件大小 | RDB有压缩机制,文件小 | 记录命令,文件大 |
宕机恢复速度 | 快 | 慢 |
数据恢复优先级 | 低 | 高 |
系统资源占用 | 高 | 低 |
使用场景 | 可以容忍一段时间的数据丢失 | 对数据安全性要求高 |