Redis持久化
RDB快照
默认情况下,redis将内存数据持久化到 dump.rdb 二进制文件中。
可以设置redis.conf文件修改 RDB 方式持久化设置,如 save 60 1000 表示在60s内有至少1000个key被改动,触发持久化,保存一次数据。关闭 RDB 只需要将配置文件中所有的 save 和 bgsave方法注释掉就可以了,还可以手动执行save指令或者bgsave指令保存数据,生成新的 RDB 文件,并覆盖老的文件。
save 和 bgsave 的区别:
命令 | save | bgsave |
io类型 | 同步 | 异步 |
是否阻塞其他redis命令 | 会 | 不会 |
优点 | 不需要子进程,就不会额外消耗内存 | 不会阻塞客户端命令 |
默认使用的是 bgsave 的方式
AOF方式
快照功能并不能完全保证数据的完整性,假如redis服务器宕机,那就会丢失最近写入,还没来得及同步到RDB文件中的数据,AOF持久话方式会把修改记录的每一条指令都记录到aof文件中(先写入缓存,每隔一段时间fsync同步到磁盘)。
比如执行 set redis learning ,在AOF中是这样记录的。
*3
$3
set
$5
redis
$8
learning
***代表这条指令有几个参数,$**代表这个参数有几个字符
打开AOF功能需要在redis.conf文件中配置
appendonly yes
开启AOF之后,每执行一条set命令,都会将这个命令追加到AOF的末尾,下次redis重启时,就会就会重新执行命令来恢复数据。
可以配置缓存向磁盘同步的策略
appendfsync always 每次有新命令执行都会同步到磁盘,最安全,但效率最低
appendfsync everysec 每过一秒同步一次,那么最多丢失一秒的数据,兼顾了效率并且相对安全
appendfsync no 从不fsync,效率最快,但是最不安全
AOF重写
aof文件中可能有很多多余的命令,比如执行了一下命令
set redis learningstart
set redis learning 执行完这个命令之后,前面那条命令就是多余的
重写会将aof中的命令重新整理,去除掉多余的命令,这样可以让 aof文件 变小,提高恢复数据效率
在redis.conf中配置redis的重写策略
auto-aof-rewrite-min-size 64mb 文件到达64mb之后触发重写,文件太小的话重写意义不大
auto-aof-rewrite-percentage 100 上次重写之后,文件大小增加了100%则再次触发重写,这里就是64mb
AOF对比RDB
持久化方式 | RDB | AOF |
文件占用空间 | 小 | 大 |
数据恢复速度 | 块 | 慢 |
数据安全性 | 容易丢数据 | 配置合适的策略安全性不错 |
redis启动时,如果既有RDB文件,又有AOF文件,优先选择AOF文件,因为AOF文件一般来说数据更安全
混合持久化方案
重启 redis 时,一般使用数据更安全AOF文件来进行,但是AOF文件相比于RDB文件慢得多,启动花费时间长,所以有了下面这种方案混合持久化。
在redis.conf文件中开启混合持久化
aof-use-rdb-preamble yes
开启混合持久化之后,AOF文件重写时,不在是单纯的重写命令,而是将重写这一刻之前的内存作rdb处理,并将rdb快照内容和新增的命令都存到AOF文件中,覆盖原有的AOF文件。
新的AOF文件既包括二进制的rdb数据,也包括存储指令的aof数据。这样redis重启时,可以先加载rdb的内容,在重新执行rdb后面的指令即可完成数据恢复,效率大大提升。
混合持久话方案兼顾了效率和安全性,选他就可以了。