往期推荐
Redis持久化机制
Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,一旦服务器进程退出,服务器中的数据库状态就会消失,所以redis提供了持久化机制,Redis持久化主要有两种方式,分别为RDB和AOF。
RDB(Redis Database)
RDB是Redis默认的持久化方式,RDB的工作原理是按照指定的时间周期策略把内存中的数据以快照的形式保存到磁盘的二进制文件中,Redis恢复数据时将保存到磁盘的二进制文件(快照文件)直接读进内存里,从而实现内存数据持久化。使用RDB持久化产生的对应文件是dump.rdb文件
工作过程
-
图解
-
过程描述
Redis会单独创建(fork)一个子进程来进行持久化,首先主进程会将内存中的数据复制到子进程的内存中,然后由子进程先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上一次持久化好的文件,子进程完成临时文件的替换后,退出并释放内存,这样一个持久化过程就完成了,整个过程主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加高效。RDB的缺点是最后一次持久化后的数据可能丢失。
RDB的优缺点
-
优点
适合做备份。比如可以在最近的24小时内,每小时备份一次RDB文件,适合做大规模的数据恢复、灾难恢复。
-
缺点
需要进行一定的时间间隔进行操作,如果Redis意外宕机了,最后一次的修改数据就没有了。比如设定每5分钟执行一次RDB持久化,如果这时候Redis宕机,则会丢失几分钟的数据。
触发RDB的条件
- 满足其中一个条件,备份就会自动生成一个
dump.rdb
文件
-
配置文件中的save规则满足的情况下,会自动触发RDB机制,将内存中的数据以快照的形式保存到磁盘的二进制文件中。
- 持久化规则(自定义)
save 3600 1 在3600秒内,如果至少有1个key进行了修改,即进行持久化操作 save 300 100 在300秒内,如果至少有100个key进行了修改,即进行持久化操作 save 60 10000 在60秒内,如果至少有10000个key进行了修改,即进行持久化操作
-
执行flushall命令,也会触发RDB机制
-
退出Redis,也会产生RDB文件
如何恢复rdb文件
- 只需要将rdb文件放在redis启动目录就可以,Redis启动的时候会自动检查
dump.rdb
并恢复其中的数据 - 查看rdb文件应该存放的位置
127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/bin"
AOF(Append Only File)
AOF是以日志的形式来记录每个写操作,将每一个写操作都通过Write函数以追加写的方式保存到appendonly.aof文件中,只许追加文件但不可以修改文件,Redis启动之初会读取该文件重新构建Redis数据库数据,换句话说,Redis重启的时候就会根据日志文件的内容将写指令从前到后执行一次完成数据的恢复工作。AOF默认是不开启的,需到redis.conf
配置文件中设置(appendonly no #改为yes,即可以开启AOF
),重启redis就可以生效。
优缺点
- 优点 AOF可以通过redis.conf配置文件配置同步策略,实现在指定的时间间隔内进行一次同步。AOF的默认策略为每秒钟同步一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算Redis宕机了,最多只会丢失一秒钟的数据,具有如下
appendfsync always 每次修改都执行一次sync(同步)
appendfsync everysec 每秒执行一个sync
appendfsync no 不执行sync,由操作系统同步,速度最快
- 缺点
- 相对于数据文件来说,AOF远远大于RDB,修复的速度也比RDB慢
- AOF运行效率比rdb慢(IO),AOF处理大量的写入会降低Redis的性能
工作过程
- 图解
- 过程描述 AOF持久化工作过程比RDB的来说复杂那么一丢丢。Redis会创建(fork)一个子进程来进行下面的持久化操作,首先子进程会根据内存中的数据快照将Redis执行过的写命令追加到临时的AOF文件中,如果在子进程工作的过程中,有写命令进来,则主进程会将写命令保存到缓存中,同时主进程也会将这些写命令保存到旧的AOF文件中,待子进程完成临时AOF文件的追加写后,子进程会通知主进程,然后主进程会将缓存中的写命令保存到临时的AOF文件中,最后将临时的AOF文件替换旧的AOF文件,实现一次持久化。
总结
RDB持久化方式能够在指定的时间间隔内将内存中的数据集快照持久化磁盘上,当Redis重启时会读取dump.rdb二进制文件恢复原始数据库数据;而AOF是记录每次对Redis的写操作到appendonly.aof文件中,当Redis重启的时候,会读取appendonly.aof文件,重新构建Redis数据库数据,从而实现持久化。Redis的持久化默认是开启的且默认采用的是RDB的持久化方式,如果我们使用Redis只需要用来做缓存无需持久化则可以关闭掉持久化功能。当然我们也可以同时开启两种持久化方式,但是Redis重启的时候会优先采用AOF文件来恢复原始数据,因为AOF文件保存的数据集要比RDB保存的数据集要完整。
🏁以上就是关于Redis持久化机制的简单介绍,如果有错误的地方,还请留言指正,如果觉得本文对你有帮助那就点个赞👍吧😋😻😍