目录
Redis的读写都在内存中,但内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,将内存中的数据存储到磁盘中的过程,就是Redis的持久化。
Redis持久化的方式
快照方式
RDB(Redis DataBase)将某一时刻的内存数据(内存快照(Snapshot)),以二进制的方式写入磁盘。
持久化触发
手动触发
手动触发持久化的操作有两个:save和bgsave,它们的主要区别是:是否阻塞Redis主线程的执行.
save命令:在redis客户端执行save命令,就会触发redis的持久化,但也会使redis处于阻塞状态,直到RDB持久化完成,才会响应其它客户端发来的请求,所以在生产环境中慎用。
bgsave命令:(background save)顾名思义,是后台保存。它和save命令最大区别就是bgsave会在后台fork()一个子进程来执行持久化,整个过程只有在fork()子进程时有短暂的阻塞,当子进程被创建后, redis的主进程就可以响应其他客户端的请求。
自动触发
1.save m n 是指在m内,如果有n个键发生改变,则自动触发持久化。参数m和n可以在redis配置文件中找到
例如:save 60 1 表示在60s内,至少有一个键发生改变,就会触发RDB持久化。
当设置多个save m n命令时,满足任意一个条件都会触发持久化。
例如:save 60 10 save 600 1
当60s内如果有10个键值发生改变,就触发持久化,如果60s内少于10个键值发生改变,那redis就会判断600s内,redis的键值是否至少修改一次,如果满足就会触发持久化。
2.flushall flushall命令用于清空redis数据库,生产环境慎用。当redis执行了flushall命令后,就会触发自动持久化,把RDB文件清空。
3.主从同步触发 在redis主从复制中,当从节点执行全量复制操作时,主节点会执行bgsave命令,并将RDB文件发送给从节点,该过程会自动触发Redis持久化。
RDB文件恢复
当Redis服务器启动时,如果Redis根目录存在RDB文件dump.rdb,Redis就会自动加载RDB文件恢复持久化数据。如果根目录没有dump.rdb文件,请先将dump.rdb文件移到redis的根目录中。
RDB优缺点
优点
RDB的内容为二进制的数据,占用内存更小,更紧凑,更适合作为备份文件;
RDB对灾难恢复非常有用,它是一个紧凑的文件,可以更快的传输到远程服务器进行redis服务恢复;
RDB可以更大程度的提高redis的运行速度,因为每次持久化时Redis主进程都会fork()一个子进程,进行数据持久化到磁盘,Redis主进程并不会执行磁盘I/O等操作;
与AOF相比,RDB可以更快的重启。
缺点
因为RDB只能保存某个时间间隔的数据,如果中途Redis服务被意外终止了,则会丢失一段时间内的Redis数据。
RDB需要经常fork()才能使用子进程持久化数据,如果数据集很大,fork()可能会很耗时。
文件追加方式
AOF(Append Only File)记录所有的操作命令,并以文本形式追加到文件中。
使用RDB持久化可能会造成最新数据丢失的风险。因为RDB的持久化有一定的时间间隔,在这个时间段内如果redis服务意外终止的话,就会造成最新数据的丢失。
持久化查询和设置
config get appendonly
开启AOF支持
1.通过命令行修改
config set appendonly yes
命令行启动的优缺点:命令行启动优点是无需重启 Redis 服务,缺点是如果 Redis 服务重启,则之前使用命令行设置的配置就会失效。
2.通过修改配置文件
只需要在配置文件中设置 appendonly yes
即可,默认 appendonly no
表示关闭 AOF 持久化。 配置文件启动 AOF 的优缺点:修改配置文件的缺点是每次修改配置文件都要重启 Redis 服务才能生效,优点是无论重启多少次 Redis 服务,配置文件中设置的配置信息都不会失效。
触发持久化
1.自动触发
有两种情况可以自动触发 AOF 持久化,分别是:满足 AOF 设置的策略触发和满足 AOF 重写触发。其中,AOF 重写触发会在本文的后半部分详细介绍,这里重点来说 AOF 持久化策略都有哪些。 AOF 持久化策略,分为以下三种:
- always:每条 Redis 操作命令都会写入磁盘,最多丢失一条数据;
- everysec:每秒钟写入一次磁盘,最多丢失一秒的数据;
- no:不设置写入磁盘的规则,根据当前操作系统来决定何时写入磁盘,Linux 默认 30s 写入一次数据至磁盘。
这三种配置可以在 Redis 的配置文件(redis.conf)中设置,如下代码所示:
# 开启每秒写入一次的持久化策略
appendfsync everysec
2.手动触发
在客户端执行bgrewriteaof命令之后,AOF持久化就会被触发
混合持久化方式
Redis4.0之后新增的方式,混合持久化结合了RDB和AOF的优点,在写入的时候,先把当前数据以RDB的方式写入文件的开头,再将后续的操作命令以AOF的格式存入文件,这样既能保证Redis重启时的速度,又能减低数据丢失的风险。