Redis AOF日志

为什么日志是后写入

因为日志没有语法检查,先写入日志,则可能写入错误命令。不利于redis使用日志恢复
后写入则是依靠redis执行,来保证命令的正确性

AOF三种落盘机制
写后落盘

redis执行完一条命令,写一次日志到磁盘中
写的操作阻塞线程,影响后续redis执行命令
效率:低
宕机 有可能丢失一条记录

一秒一写

redis执行完一条命令后,将命令写入AOF内存缓冲区
每隔一秒将缓冲区内容写入磁盘(异步)
效率:中
宕机 有可能丢失一秒内的日志

操作系统控制写回

redis执行完一条命令后,将命令写入AOF内存缓冲区
由操作系统控制何时写到磁盘中去(异步)
效率:高
宕机 有可能丢失大量日志

AOF重写

AOF重写的作用就是忽略过程,注重结果(反正我没事务)
假设我有个记录A,被100个命令修改了一百次,最后的结果是100
此时AOF记录就有100条,但是重写后就只有一条
即 A = 100
AOF重写减小日志大小
大文件是文件操作系统所不允许的
大文件的日志会影响写入速度
大文件的日志会影响redis的恢复速度

AOF重写机制

主线程fork出bgrewriteaof子进程
bgrewriteaof中拷贝redis内存数据
bgrewriteaof中的线程将reids内存数据 + AOF重写缓冲区数据 组成新的AOF 来替换旧的AOF
在AOF重写过程中,旧的AOF依旧在正常写入,来应对重写未完成时的宕机问题

在这里插入图片描述

AOF重写是会影响主线程的

1.在子进程拷贝数据时会阻塞主线程
2.在主线程操作已有数据时,也会阻塞
父子进程拷贝数据使用的是写时复制
子进程中只拷贝必要的数据结构
子进程和父进程指向相同的内存空间
当父进程进行写的操作时,才会分配新的内存地址,将数据拷贝进去

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis AOF是一种持久化机制,用于将Redis服务器的操作日志以追加的方式记录在磁盘上。引用中提到,当AOF文件的体积变得过大时,Redis可以自动进行AOF重写。AOF重写实际上是对当前数据集所需的最小命令集合进行重写,而不是对原有的AOF文件进行写入和读取操作。这个重写过程是在后台进行的,通过fork子进程来执行。重写后的新AOF文件能够恢复当前数据集的状态。 引用中提到,RedisAOF重写程序放在后台子进程中执行的原因是为了避免影响服务器的请求处理能力。通过将AOF重写程序放在后台执行,可以确保服务器能够继续处理请求,而不会被AOF重写过程阻塞。 在Redis服务器中,redisServer结构维护着服务器的状态,而aof_buf域则用来保存等待写入AOF文件的协议文本(RESP)。这些协议文本包含了对键的操作命令,用于记录服务器的操作日志。当需要将操作日志写入AOF文件时,这些协议文本会被写入到AOF缓冲区中,然后由后台的AOF子进程负责将缓冲区中的内容写入到AOF文件中。这种方式可以提高性能,并且减少了直接写入文件的开销。引用中提到了这一点。 综上所述,RedisAOF机制是通过记录操作日志来实现数据持久化的。当AOF文件体积过大时,Redis会自动进行AOF重写,将当前数据集所需的最小命令集合写入一个新的AOF文件中。为了避免影响服务器的请求处理能力,AOF重写过程会在后台执行。通过维护一个AOF缓冲区,Redis可以将待写入的协议文本暂时保存在内存中,然后由后台子进程负责将其写入AOF文件中。这种机制可以提高性能并减少直接写入文件的开销。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值