问题引入:
我么知道,redis是内存存储,mysql是磁盘存储,如果电脑关机或断电,redis是如何保证数据不丢失的呢?
Redis的持久化有如下两种机制
- RDB:将Reids在内存中的数据库定时dump到磁盘上(默认文件名
dump.rdb
) - AOF:将Reids的操作日志以追加的方式写入文件(默认是
appendonly.aof
)
一、RDB 快照持久化(默认开启)
redis可以将内存中的数据定期写入磁盘进行持久化。在进行持久化时,redis会创建子进程来执行。
持久化的三种触发机制:
1、定期自动触发(bgsave)
配置文件通常在放在/etc/redis/redis.conf
目录
# ...
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save ""
save 900 1 # 每900秒,如果至少有1个key发生变化就触发持久化操作,后面两个意思一样
save 300 10
save 60 10000
2、手动触发
在redis-cli
中,执行下面三个命令:
① save
这种触发会阻塞当前Redis服务器,即Redis不能再提供其他服务,直到备份完成为止。
② BGSAVE
这种触发机制会执行fork()
开启一个子线程在后台进行持久化,虽然fork阶段也会阻塞进程,但是时间极短,所以我们常用bgsave进行持久化。
③ SHUTDOWN
关闭redis时触发
二、AOF 追加文件持久化(默认未开启)
redis可以将执行的所有指令
追加记录到文件
中持久化存储,这是redis的另一种持久化机制。
通过修改配置文件redis.conf
开启AOF机制:
appendonly yes # 是否开启AOF,默认是no
appendfilename "appendonly.aof" # AOF文件
AOF机制记录操作的时机
# appendfsync always # 每个操作都写到磁盘中
appendfsync everysec # 每秒写一次磁盘,默认
# appendfsync no # 由操作系统决定写入磁盘的时机
注解:
always
: 一旦有数据发生改变就写到AOF
everysec
: 每一秒都同步,这个是默认的方式
no
: 从不同步,即不进行持久化
使用AOF机制的缺点是随着时间的流逝,AOF文件会变得很大。所以需要对AOF文件进行重写,比如说丢合并命令、丢弃无用命令等。重写AOF文件的操作,并没有读取旧的AOF文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的AOF文件,这点和快照有点类似