请你谈谈Redis持久化?

Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以 Redis 提供了持久化功能!持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

1RDB(Redis DataBase)

RDB 持久化机制,是对 Redis 中的数据执行周期性的持久化:在指定的时间间隔内将内存中的数据集体写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。

RDB对Redis的性能影响非常小:Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。而且他在数据恢复的时候速度比AOF来的快。相对于数据集大时,比 AOF 的启动效率更高。

我们默认的就是 RDB,一般情况下不需要修改这个配置!rdb保存的文件是dump.rdb都是在我们的配置文件中快照中进行配置的!

1、数据的完整性问题: RDB都是快照文件,都是默认五分钟甚至更久的时间才会生成一次,这意味着你这次同步到下次同步这中间五分钟的数据都很可能全部丢失掉,而AOF则最多丢一秒的数据。
2、 fork进程的时候,会占用一定的内存空间: RDB在生成数据快照的时候,如果文件很大,客户端可能会暂停几毫秒甚至几秒,你公司在做秒杀的时候他刚好在这个时候fork了一个子进程去生成一个大快照,这个时候就会出大问题。

请你谈谈Redis持久化?_第1张图片
触发机制:1 save的规则满足的情况下,会自动触发rdb规则 2 执行 flushall 命令,也会触发我们的rdb规则! 3 退出redis,也会产生 rdb 文件!只需要将rdb文件放在我们redis启动目录就可以,redis启动的时候会自动检查dump.rdb 恢复其中 的数据!
查看需要存在的位置

127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/bin" # 如果在这个目录下存在 dump.rdb 文件,启动就会自动恢复其中的数据

2AOF(Append Only File)

AOF 机制,对每条写入命令作为日志,以 append-only 的模式写入一个日志文件中,因为这个模式是只追加的方式,所以没有任何磁盘寻址的开销,所以很快,当重启Redis会根据日志中文件的写记录恢复数据。AOF保存的是 appendonly.aof文件。

1、RDB五分钟一次生成快照,但是AOF是一秒一次去通过一个后台的线程fsync操作,那最多丢这一秒的数据。
2、AOF在对日志文件进行操作的时候是以append-only的方式去写的,他只是追加的方式写数据,自然就少了很多磁盘寻址的开销了,写入性能惊人,文件也不容易破损。
3、AOF的日志是通过一个叫非常可读的方式记录的,这样的特性就适合做灾难性数据误删除的紧急恢复了,比如flushall清空了所有的数据,只要这个时候后台重写还没发生,你马上拷贝一份AOF日志文件,把最后一条flushall命令删了就完事了。

1、一样的数据,AOF文件比RDB还要大。
2、AOF开启后,Redis支持写的QPS会比RDB支持写的要低,他每秒都要去异步刷新一次日志fsync
3、aof 默认就是文件的无限追加,文件会越来越大!

请你谈谈Redis持久化?_第2张图片
默认是不开启的,我们需要手动进行配置!我们只需要将 appendonly 改为yes就开启了 aof! 重启,redis 就可以生效了!如果这个 aof 文件有错位,这时候 redis 是启动不起来的吗,我们需要修复这个aof文件:
redis 给我们提供了一个工具 redis-check-aof --fix

3如何选择合适的持久化方式

如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

一般来说, 如果数据安全性要求特别高,你应该同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。

如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。

有很多用户都只使用AOF持久化,但并不推荐这种方式,因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此之外,使用RDB还可以避免AOF程序的bug。

如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。

两种机制全部开启的时候,Redis在重启的时候会默认使用AOF去重新构建数据,因为AOF的数据是比RDB更完整的。

你可能感兴趣的:(数据库-Redis,redis)