?兩種持久化策略:
????????Redis這個緩存存放的數據是存到內存的,假如宕機了,那么就會數據丟失。如何避免這種情況呢?由此,Redis推出了兩種持久化機制。
? ? ? ? 第一種機制就是以二進制序列形式存儲數據的RDB快照,第二種機制就是以命令形式存放的aof日志。
????????那么Redis為什么不推出一種統一的持久化機制,而是采用了兩種呢?其實就是對應不同的兩種使用場景。
????????設想一種場景,Redis機器重啟時,這時候需要重新加載所有的數據來恢復內存。
????????但有一種場景,不需要重新加載數據,而只需要加載增量的數據。此時,其實就可以獲取后續增量的指令,執行這些指令,自然就能獲取所有的數據。
RDB快照原理
? ? ? ? Redis是單線程執行命令,當執行RDB快照時,會不會發送堵塞?答案是不會,RDB快照時涉及到了一個思想,寫時復制 copy on write。
? ? ? ? 執行快照嗎,其實就是執行save命令。主進程會fork一個子進程,此時,主子進程都會共享這一瞬間,相同一塊的內存空間(即操作系統的數據段)。主進程負責響應客戶端的請求,子進程負責遍歷內存數據,執行持久化。
? ? ? ? 從這個流程也可以看出來RDB的局限性,它只是保存一瞬間的快照,并不能保存全量的數據。
AOF的原理
????????一句話,AOF的原理就是記錄Redis服務器的順序的寫指令。當然,由于其記錄的是指令,會占據太多無用的內存空間。因此,時間一長,就不得不清理這些冗余的指令,這就觸發了redis的aof重寫,即:bgrewriteaof指令。
? ? ? ? AOF的重寫,也如同rdb快照一樣,都是讓子進程執行的,通過精簡各種指令,減少重復指令等減少內存占用。
? ? ? ? AOF形式持久化的缺點就是,當恢復數據時,由于單線程順序執行aof的指令,其回復速度非常慢。
混合持久化
? ? ? ? 前面的介紹可以看出來,RDB占據的空間相對小,并且恢復起來速度快,但會丟失數據。AOF可以保存到指令級的數據,但由于其順序執行指令才能持久化數據。那么混合持久化應運而生,將增量的AOF文件和RDB快照結合一起,汲取兩者的優點。
????????
????????