以下总结学习自小破站视频:www.bilibili.com/video/BV1S5…
方式一:RDB
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是进行Snapshot快照,恢复时将快照文件直接读到内存里
Redis会单独创建一个(fork)一个子进程进行持久化,会先将数据写入到一个临时文件中,待持久化过程结束后,再用这个临时文件替换上次的持久化文件。
整个过程中主进程是不会进行任何IO操作,保持了极高的性能
redis默认持久化方式
指定的时间间隔的配置方法
在redis.conf文件的SNAPSHOTTING有以下配置:
#如果900s内,至少有1个key进行了修改,则会进行持久化操作
save 900 1
#如果300s内,至少有10个key进行了修改,则会进行持久化操作
save 300 10
#如果60s内,至少有10000个key进行了修改,则会进行持久化操作
save 60 10000
RDB的其他相关配置
#持久化失败了还是否会继续工作
stop-writes-on-bgsave-error yes
#是否压缩rdb文件,rdb文件即为持久化后的文件
rdbcompression yes
#保存rdb文件时是否校验
rdbchecksum yes
#rdb持久化文件
dbfilename dump.rdb
#rdb文件保存的目录
dir ./
疑问
如何触发持久化机制,生成持久化文件
dump.rdb?有以下3种方法
- 配置文件中SNAPSHOTTING save字段规则满足的情况
- 执行flushall命令
- 退出redis
flushall后,如何恢复(导出)rdb文件里面保存的数据?
把rdb文件放在redis启动目录,正常启动就回去load rdb文件
优点
- 适合大规模的数据恢复
- 对数据完整性要求不高
缺点
- 需要一定的时间间隔进行操作,如果redis意外宕机则会导致最后一次修改的数据丢失
- fork进程的时候,会占用一定内存空间
方式二:AOF
以日志的形式来记录每个写操作,将redis执行过的所有指令记录下来(读操作不记录),只会追加文件但不会改写文件
redis启动会读取该文件重构数据,即把日志文件记录的指令执行一遍以完成数据恢复
需要在redis.conf文件中打开,否则会默认会使用RDB的方式进行持久化
#默认为关,设为yes表示使用AOF持久化
appendonly no
#aof持久化文件
appendfilename "appendonly.aof"
AOF3种同步数据的方式
# appendfsync always #每次修改都会同步,消耗性能
appendfsync everysec #每秒进行sync一次,可能会丢失这1s的数据
# appendfsync no #不执行同步,操作系统自己同步数据
优点
- 每一次修改都可以同步,文件的完整性会更好
- 每秒同步一次,可能会丢失一次数据
- 从不同步,效率最高
缺点
- aof文件比rdb大很多,恢复需要更多时间
- aof运行效率比rdb慢
如果aof或者rdb文件有错误,会导致redis启动失败,可以使用以下工具修复错误文件