Redis有3種實現持久化的方式:AOF日誌、RDB快照、混合持久化 Redis寫入AOF日誌的過程 Redis執行完寫操作命令後,將命令追加到server.aof_buf緩衝區 通過write()系統調用,將aof_buf緩衝區的數據寫入到AOF文件 數據被拷貝到了內核緩衝區page cache ...
Redis有3種實現持久化的方式:AOF日誌、RDB快照、混合持久化
Redis寫入AOF日誌的過程
- Redis執行完寫操作命令後,將命令追加到server.aof_buf緩衝區
- 通過write()系統調用,將aof_buf緩衝區的數據寫入到AOF文件
- 數據被拷貝到了內核緩衝區page cache
- 由內核決定何時將數據寫入硬碟
Redis實現RDB快照
生成 RDB 文件的兩個命令:save
和 bgsave
執行save命令會在主線程生成RDB文件,執行bgsave命令會創建一個子進程來生成RDB文件
執行bgsave命令時,會通過fork()創建子進程,子進程和父進程共用同一片記憶體數據。因為創建子進程的時候,子進程複製父進程的頁表,但頁表指向的物理記憶體還是一個。如果主線程執行讀操作,則主線程和 bgsave 進程互不影響;如果主線程執行寫操作,則被修改的數據會複製一份副本,然後 bgsave 子進程會把該副本數據寫入 RDB 文件,在這個過程中,主線程仍然可以直接修改原來的數據
混合持久化
在AOF日誌重寫過程,當開啟了混合持久化時,在AOF重寫日誌時,fork出來的重寫子進程會先將與主線程共用的記憶體數據以RDB方式寫到AOF文件,然後主線程處理的操作命令會被記錄在重寫緩衝區,重寫緩衝區里的增量命令會以AOF方式寫入到AOF文件,寫入完成後通知主進程將含有的RDB格式和AOF格式的AOF文件替換舊版。
本文根據小林coding整理。旨在理解混合持久化實現過程。