从零开始Redis(十三)之持久化

135 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

🍊作者简介:少年不想说话,努力长大

🍊往期回顾:从零开始Redis(十二)

🍊近期目标:写完基础源码,点赞👍🏼、收藏⭐、留言📩

前面我们已经说完了锁也说完了数据操作,那是不是得说说数据持久化,毕竟这也是redis的一个亮点啊,这讲我们将分两节说;

Redis持久化

Redis提供了两种持久化的方式,一个RDB,一个AOF;先来了解下基本概念 ,

RDB持久化表示在指定的时间内生成数据集的快照(snapshot)即将内存数据写入磁盘。 

AOF持久化表示记录服务器执行的所有写操作命令,它可以在服务器启动时,通过重新执行这些命令来还原数据集。启动中对于新命令会被追加到文件的末尾。我们还可以在后台对AOF文件进行重写;

 Redis可以同时使用AOF持久化和RDB持久化。

在这种情况下,当Redis重启时会优先使用AOF文件来还原数据集(磁盘数据读到内存),为什么选择AOF呢?因为AOF文件保存的数据集比RDB文件所保存的数据集会更完整,对数据的影响最小。 

redis如何持久化 

redis的持久化用的是我们熟悉的写时复制机制,类似于java的CopyOnWrite,我们看下它的执行步骤;首先Redis会通过调用fork()来单独创建一个子进程用于进行持久化操作,所以现在我们同时拥有了父进程和子进程。

对于RDB,在指定的时间段内持久化完毕,会将这个临时文件内容覆盖到dump.rdb,用的就是写时复制思想,所以我们不建议采用RDB的时候将时间设置过短,导致频繁覆盖。 通常我们用

save 秒数 修改次数,

这个表示多少秒修改了多少次就自动生成一个RDB,由于是写时复制,所以我们得考虑复制带来的内存问题;

对于AOF,子进程开始对新AOF文件操作,将内存内容写入到临时文件。对于所有新执行的写入命令,父进程会执行它们的同时也会将这些改动放到aof_rewrite_buf缓冲区中,在到了下面配置的同步时间后会将进入缓存区的命令追加到文件后;这样就算重写过程中发生宕机,也不担心这段时间内我们的写入命令会丢失。 当子进程重写结束时,它会告诉父进程然后将内存缓存中的所有命令追加到新的AOF文件的末尾。 然后之后所有命令都会直接追加到新AOF文件的末尾;我们可以将配置改成下面的,开启AOF;

appendonly no改换为yes

通常我们控制AOF的同步频率的是通过

appendfsync always始终同步,每次写入都会立刻追加;最影响性能但数据完整性保持较好。 

appendfsync everysec每秒同步,每秒写入追加一次,宕机最多只会丢失本秒的数据。 appendfsync no不主动同步,把同步操作交给操作系统;

好了,如果我们就是仅仅想要redis做个中转,对里面的内存数据不是很在意,可以丢失,我们就可以关闭持久化功能,让数据只在服务器运行时存在,关闭即删除所有数据;大概的概念就说这些,明天展开聊聊两者优缺点🥗🥗🥗;

结束结束,那就🛴🛴🛴

如果对你有所帮助

点个赞呗