预写式日志(Write-Ahead Logging (WAL))
基本上所有的数据库都实现了这个WAL技术,来保证原子性和持久性。
WAL的核心思想是:在数据写入到数据库之前,先写入到日志,这一定程度上也可以提高效率,因为不需要每次都和磁盘交互,可以先记录下来,等到下次IO的时候再一次性页写入。
为什么redis是先写数据然后再写日志呢?
第一个是因为redis的aof的文件比较大,如果每次都记录日志,可能会有很多错误的指令进入日志,所以先通过执行指令,同时执行的时候就可以检查语句是不是有语法错误,没有错误就可以写入日志。而db因为有了数据库表的信息,所以不需要执行就可以发现语法是不是正确的。
第二是因为redis是基于内存的,需要先修改到内存再持久化到日志文件。