💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 持续学习,不断总结,共同进步,活到老学到老
- 人生的本质是追寻自我的提升,包括思想、能力、意志等等。
- 直面变化,找到背后更基础的东西,更基础的东西是用户的需求。
- 我们的成功是我们的现在和将来决定的。今天和明天已经由昨天决定,你还可以决定后天。
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
16.AOF 保存的命令
AOF 保存的命令:
- 对键值对的修改命令
- PUBSUB 命令
- SCRIPT LOAD 命令
AOF 工作原理:
-
AOF 重写和 rdb 创建快照一样,都是巧妙的利用了
写时复制
机制。 -
redis 调用
fork
,现在有父子两个进程。 -
根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令。
-
父进程继续处理
client 请求
,除了把写命令写入到原来的aof
文件中。同时把收到的写命令缓存起来
。这样就能保证如果子进程重写失败的话并不会出问题。 -
当
子进程把快照内容以命令方式写到临时文件中
后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件
。 -
现在父进程可以使用
临时文件
替换老的aof 文件
,并重命名,后面收到的写命令也开始往新的 aof 文件中追加。
17.AOF 后台重写
BGREWRITEAOF 函数实现原理
aof_rewrite 函数的缺点:
AOF 重写程序 aof_rewrite
函数可以很好地完成创建一个新 AOF
文件的任务, 但是,因为这个函数会进行大量的写入操作,所以调用这个函数的线程将被长时间阻塞,因为 Redis 服务器使用单个线程来处理命令请求,所以如果由服务器直接调用 aof_rewrite
函数的话,那么在重写 AOF
文件期间,服务期将无法处理客户端发来的命令请求。
很明显,作为一种辅佐性的维护手段,Redis 不希望 AOF 重写造成服务器无法处理请求, 所以 Redis 决定将 AOF 重写
程序放到子进程
里执行,这样做可以同时达到两个目的:
子进程
进行 AOF 重写期间,服务器进程(父进程
)可以继续处理命令请求子进程
带有服务器进程的数据副本,使用子进程
而不是线程
,可以在避免使用锁的情况 下,保证数据的安全性
18.AOF 对过期处理
当服务器以 AOF
持久化模式运行时,如果数据库中的某个键已经过期,但它还没有被惰性删除或者定期删除,那么 AOF
文件不会因头这个过期键而产生任何影响。
当过期键被惰性删除
或者定期删除
之后,程序会向 AOF
文件追加(append)一条 DEL
命令,来显式地记录该键已被删除。
19.RDB 和 AOF 选择
redis
使用了 2 种方式进行持久化:
Snapshotting
(快照 RDB,默认方式):能够在指定的时间间隔对你的操作进程快照存储Append-only file
(缩写 aof):记录每次对服务器写的操作,当服务器重启时会重新执行这些命令来恢复原始的数据
RDB
和 AOF
兼容性:
-
默认情况下,Redis 将数据库
快照
保存在一个dump.rdb
的二进制
文件中。 -
如果服务器开启了
AOF
持久化功能,那么服务器会优先使用AOF
文件来还原数据库状态。 -
只有在
AOF
持久化功能处于关闭状态时,服务器才会使用RDB
文件来还原数据库状态。
觉得有用的话点个赞
👍🏻
呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙