Redis为什么先执行指令,再写AOF日志?

为什么这么问

因为在常见的数据库中,持久化重做日志一般是先写日志再修改数据库,保证数据/操作不会丢失。所以看到redis的AOF日志的机制后,很困惑,网上连这个问题的提问都没有,书上也是一笔带过。要弄明白这个问题,首先要搞懂Redis写AOF日志的流程。

写AOF日志

首先,AOF日志中写入的是收到的操作命令记录。redis包含丰富的数据类型,对set数据执行Rpush显然会发生错误,因此命令写入AOF日志前redis会检查语法,参数校验等,没问题的话,再写入日志。比如下图:

image.png

显然rpush java这条命令参数出现错误,而rpush books java类型错误,redis会完成参数校验和语法检测,这种错误的命令也显然不能修改数据。

其次 AOF日志在大量写数据的情况下,由于所有的修改命令都要写入AOF日志,因此AOF日志文件会很大,这时候就需要重写AOF日志了。

原因分析:

其他的数据库,比如mysql的redo log写入的是数据页修改的记录,写入的是物理修改,因此在事务提交时先写redo log,再做修改操作,可以保证突然宕机时数据不会丢失。通过上面写AOF日志的简单分析,如果redis也采取先写日志再操作的话,AOF日志中会出现很多无效/错误的命令记录,对本来就庞大的AOF文件来说简直是雪上加霜,我认为这是第一个原因(允许反驳)。

另外一个原因我认为是,redis的事务比起mysql等数据库的事务机制来说,可以称为弱事务,事务中出现某一个错误也会继续执行,同时如果CAS发现事务执行过程中,数据被其他线程更改了,那么事务执行失败,redis也没有回滚。这样的事务,会出现很多没有修改成功数据命令。如果先写日志,同样会有很多无效命令(同样允许反驳)。

以上是我个人看法,有大神的高见,赶紧砸向我的脸!!!

--------------------- 

作者:Handoking 

来源:CSDN 

原文:https://blog.csdn.net/Handoking/article/details/97512458 

版权声明:本文为博主原创文章,转载请附上博文链接!

tags: Redis