Subscribe
池塘🐟
Search
Sign up
php
laravel
mysql
docker
redis
rabbitmq
go
js
其他
笔记:redis的AOF机制
### redis数据持久化-AOF日志 #####1、AOF 是写后日志 ``` 意思是 Redis 是先执行命令,把数据写入内存,然后才记录日志;写后日志这种方式,就是先让系统执行命令,只有命令能执行成功,才会被记录到日志中,否则,系统就会直接向客户端报错。所以,Redis 使用写后日志这一方式的一大好处是,可以避免出现记录错误命令的情况。 除此之外,AOF 还有一个好处:它是在命令执行后才记录日志,所以不会阻塞当前的写操作。 ``` ##### 2、三种写回策略 ```` Always 同步写回:每个写命令执行完,立马同步地将日志写回磁盘; Everysec 每秒写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘; No 操作系统控制的写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。 根据系统对高性能和高可靠性的要求,来选择使用哪种写回策略了。 总结一下就是:想要获得高性能,就选择 No 策略;如果想要得到高可靠性保证,就选择Always 策略;如果允许数据有一点丢失,又希望性能别受太大影响的话,那么就选择Everysec 策略。 ``` ##### 3、AOF重写机制 ``` AOF 是以文件的形式在记录接收到的所有写命令。随着接收的写命令越来越多,AOF 文件会越来越 大。AOF重写机制具有“多变一”功能。所谓的“多变一”,也就是说,旧日志文件中的多条命令,在重写后的新日志中变成了一条命令。 和 AOF 日志由主线程写回不同,重写过程是由后台线程 bgrewriteaof 来完成的,这也是为了避免阻塞主线程,导致数据库性能下降。总结为:一个拷贝,两处日志。 因为主线程未阻塞,仍然可以处理新来的操作。此时,如果有写操作,第一处日志就是指正在使用的 AOF 日志,Redis 会把这个操作写到它的缓冲区。这样一来,即使宕机了,这个 AOF 日志的操作仍然是齐全的,可以用于恢复。而第二处日志,就是指新的 AOF 重写日志。这个操作也会被写到重写日志的缓冲区。这样,重写日志也不会丢失最新的操作。等到拷贝数据的所有操作记录重写完成后,重写日 志记录的这些最新操作也会写入新的 AOF 文件,以保证数据库最新状态的记录。此时,我 们就可以用新的 AOF 文件替代旧文件了。 ``` ##### 总结 ``` Redis 用于避免数据丢失的 AOF 方法。这个方法通过逐一记录操作命令,在恢复时再逐一执行命令的方式,保证了数据的可靠性。AOF 日志的三种写回策略,分别是 Always、Everysec 和 No,这三种策略在可靠性上是从高到低,而在性能上则是从低到高。 此外,为了避免日志文件过大,Redis 还提供了 AOF 重写机制,直接根据数据库里数据的最新状态,生成这些数据的插入命令,作为新日志。这个过程通过后台线程完成,避免了对主线程的阻塞。 AOF数据恢复的使用,Redis 的单线程设计,这些命令操作只能一条一条按顺序执行,这个“重放” 的过程就会很慢了 ```
提交评论
提交