Redis 数据持久化机制 RDB 和 AOF介绍

🍀java全知识点学习笔记 思维导图 面试跳槽必备 码云仓库地址 https://gitee.com/vx202158/vx202158.git 🍀

:palm_tree:单线程的Redis为什么这么快?

:herb: Redis的 " 单线程 "

Redis的单线程指的的是Redis的 网络IO数据读写 是由一个线程完成的

但Redis的 数据持久化 , 异步删除, 集群之间数据同步是由其他线程完成的

image-20220306163042788

:herb: Redis快的原因

  1. 🍀 避免了维护多线程共享数据安全的开销

  2. 🍀 基于内存操作

  3. 🍀 ``高效的数据结构 跳表 和 哈希表

  4. 🍀采用多路IO复用,能在网络IO中并发处理大量的客户端请求

:palm_tree:Redis的数据持久化

由于Redis是基于内存操作的,数据都存储在内存中,如果一断电,数据必将丢失

Redis提供了两个数据持久化机制来解决这个问题

  1. 🍀AOF日志

  2. 🍀 RDB快照

:herb: AOF持久化机制

🍃 AOF持久化流程

客户端的请求写命令会被追加到AOF缓冲区

AOF缓冲区根据AOF持久化策略将操作同步到磁盘的AOF文件中

AOF文件超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量

Redis服务器重启时,会load加载AOF文件中的写操作

🍃 写后日志

                                                    写前日志

image-20220306172021780

                                                    写后日志

image-20220306172434517

AOF为什么采用写后日志?
  1. 🍀首先要知道日志是用来恢复数据的 因此日志不能存储错误的命令 假如 采用写前日志,则需要对存入日志中的每一条命令进行检查,这样势必会带来性能开销 而redis就是为了追求速度 采用写后日志,只有能成功执行的命令才存入日志中 不用去对命令进行检查
  1. 🍀 由于Redis的读写操作是单线程的 采用写后日志 可以避免对 写操作的阻塞

🍃日志记录的三种策略

  1. 🍀 appendfsync always 始终同步

  2. 🍀 appendfsync everysec 每秒同步一次

  3. 🍀 appendfsync no 不主动进行同步,把同步时机交给操作系统。

:cactus: 三者各有优缺点 :

appendfsync  always   始终同步

每个写操作执行完毕后里面同步到日志文件中  性能较差但 数据 完整性 比较好
appendfsync  everysec  每秒同步一次

每隔一秒钟进行一次同步,先将日志写到AOF文件的内存缓冲区,每隔一秒再把缓冲区的内容写入磁盘,如果宕机,本秒的数据可能丢失
appendfsync  no  不主动进行同步,把同步时机交给操作系统

性能好,但是宕机会丢失大量数据

image-20220306181846233

🍃AOF文件重写

由于AOF是记录每一条写操作命令,势必会让AOF文件越来越大,文件越大,恢复数据的时候越慢


因此需要对AOF文件进行重写
                                            AOF重写的过程
fork 一条子进程  读取当前Redis服务器的数据库信息  遍历所有的键生成对应的新命令,写到新的AOF文件中  


重写的时候,Redis服务器主进程依然能接受处理请求,AOF重写的时候会启用AOF文件重写缓冲区,主进程处理请求后会将命令追加到AOF文件缓冲区


当子进程完成AOF文件重写后  会将AOF文件重写缓冲区的内容写到新的AOF文件中  然后再将新的AOF文件覆盖原理的AOF文件

image-20220306185143444

:herb: RDB持久化机制

🍃 RDB持久化流程

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失

🍃 RDB触发方式

  1. 🍀save : 会阻塞主进程
  2. 🍀执行 bgsave 命令 : fork一条子进程完成数据快照,不会阻塞主进程

🍃 RDB持久化相关配置

stop-writes-on-bgsave-error    当Redis无法写入磁盘的话,直接关掉Redis的写操作。推荐yes
rdbcompression 压缩文件      如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能。推荐yes.
rdbchecksum 检查完整性    在存储快照后,还可以让redis使用CRC64算法来进行数据校验

:herb:AOF持久化和RDB持久化对比

image-20220306192238404

#实习经验分享##学习路径##社招##校招##笔记##求内推##Java##面经#
全部评论

相关推荐

评论
3
17
分享
牛客网
牛客企业服务