Redis在内存中保存数据,而内存数据是易失性的。这意味着如果Redis进程关闭或崩溃,所有在内存中的数据都将丢失。为了避免这种情况,Redis提供了持久化功能,它可以将Redis的数据存储到磁盘上,以便在Redis重新启动时能够恢复数据。
RDB Persistence 在指定的时间间隔内执行数据集的时间点快照
AOF持久性记录服务器收到的增删改操作,然后可以在服务器启动时再次播放这些记录,重建原始数据集
你可以完全禁用持久性,这有时在缓存中使用
你可以在同一实例中合并 DRB 和 AOF
实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是快照
这样一来,即使故障宕机,快照文件也不会丢失
这个快照文件就称为RDB文件(dump.rdb)
Redis的数据都在内存中,保存备份时它执行的是全量快照,也就是说,把内存中的所有数据都记录到磁盘中,一锅端
在执行RDB操作时,Redis会阻止所有客户端进行写操作,以确保在生成RDB文件期间不会有任何数据更改
RDB操作在Redis不同版本,也有较大改动
7以前:
7以后:
shut down 和 flushdb 命令会触发RDB
save 5 2
dir ./dumpfiles
//需要注意的是,dumpfiles需要提前创建好
dbfilename dump6379.rdb
然后5s内执行两次操作,发现自动存储了rdb文件:
save:
在主程序中执行会阻塞当前redis服务器,直到持久化工作完成
执行save命令期间,redis不能处理其他命令
线上禁止使用save命令!!!
bgsave:
redis会在后台异步进行快照操作,不阻塞
快照同时还可以响应客户端请求
可以通过lastsave命令获取最后一次成功执行快照的时间
RDB最大限度地提高了redis的性能,因为redis父进程为了持久化做的唯一工作就是派生一个将完成所有持久化工作的子进程,而父进程不用做任何磁盘IO/或类似操作
与AOP相比,RDB即使是大数据集也会更快地重启
RDB是一个非常紧凑的单文件时间点表示,非常适合备份
它是容易恢复的,是一个可以传输到远程数据中心或云端的压缩文件
如果要把redis停止工作时(例如断电后)造成的数据损失降到最低,RDB做的并不好
RDB需要经常fork()以便使用子进程进行持久化,如果数据集很大而且CPU性能不好,redis可能停止为客户端服务几毫秒甚至一秒钟 建议调整写日志的频率
save “”
将redis执行过的所有写操作记录下来,重启redis服务器会重新执行写操作
开启AOF:
appendonly yes
AOF缓冲区会根据AOF缓冲区同步文件的三种写回策略将命令写入磁盘上的AOF文件中
同步写回,每个写命令执行完立刻同步地将日志写回磁盘
操作系统控制写回,每个写命令执行完,只是先把日志写到AOF缓冲区,由操作系统决定何时写回磁盘
每秒写回,每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔1S把缓冲区中的内容写入磁盘
appendfsync everysec
appendfilename "appendonly6379.aof"
//修改保存名称
redis-check-aof --fix dumpfiles/appendonly6379.aof
由于AOF持久化机制是不断把写命令记录到AOF文件中,那么随着写命令越来越多,AOF文件会越来越膨胀
文件越大,占用服务器内存和AOF恢复占用时间越长
为了解决这个问题,引入了AOF重写机制
AOF重写机制是干什么的? 给AOF文件瘦身的 瘦身计划
只保留可以恢复数据的最小指令集
可以手动使用命令 bgrewriteaof 来刷新
例如有三条命令
重写前:
set k1 v1
set k1 v2
set k1 v3
重写后:
set k1 v3
注意,同时满足且的关系才会触发
结论: RDB做全量持久化,AOF做增量持久化
在不考虑混合持久化的时候,同时开启rdb和aof持久化时,重启时只会加载aof文件,不会加载rdb文件
为了提高redis的性能,不需要做持久化操作,也就是同时关闭rdb和aof
关闭rdb : save “”
关闭aof : appendonly no