Redis實現(xiàn)持久化的方式匯總
Redis有3種實現(xiàn)持久化的方式:AOF日志、RDB快照、混合持久化
Redis寫入AOF日志的過程
Redis執(zhí)行完寫操作命令后,將命令追加到server.aof_buf緩沖區(qū)
通過write()系統(tǒng)調(diào)用,將aof_buf緩沖區(qū)的數(shù)據(jù)寫入到AOF文件
數(shù)據(jù)被拷貝到了內(nèi)核緩沖區(qū)page cache
由內(nèi)核決定何時將數(shù)據(jù)寫入硬盤
Redis實現(xiàn)RDB快照
生成 RDB 文件的兩個命令:save 和 bgsave
執(zhí)行save命令會在主線程生成RDB文件,執(zhí)行bgsave命令會創(chuàng)建一個子進程來生成RDB文件
執(zhí)行bgsave命令時,會通過fork()創(chuàng)建子進程,子進程和父進程共享同一片內(nèi)存數(shù)據(jù)。因為創(chuàng)建子進程的時候,子進程復(fù)制父進程的頁表,但頁表指向的物理內(nèi)存還是一個。如果主線程執(zhí)行讀操作,則主線程和 bgsave 進程互不影響;如果主線程執(zhí)行寫操作,則被修改的數(shù)據(jù)會復(fù)制一份副本,然后 bgsave 子進程會把該副本數(shù)據(jù)寫入 RDB 文件,在這個過程中,主線程仍然可以直接修改原來的數(shù)據(jù)
混合持久化
在AOF日志重寫過程,當開啟了混合持久化時,在AOF重寫日志時,fork出來的重寫子進程會先將與主線程共享的內(nèi)存數(shù)據(jù)以RDB方式寫到AOF文件,然后主線程處理的操作命令會被記錄在重寫緩沖區(qū),重寫緩沖區(qū)里的增量命令會以AOF方式寫入到AOF文件,寫入完成后通知主進程將含有的RDB格式和AOF格式的AOF文件替換舊版。
到此這篇關(guān)于Redis實現(xiàn)持久化的方式匯總的文章就介紹到這了,更多相關(guān)Redis實現(xiàn)持久化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
redis.conf中使用requirepass不生效的原因及解決方法
本文主要介紹了如何啟用requirepass,以及啟用requirepass為什么不會生效,從代碼層面分析了不生效的原因,以及解決方法,需要的朋友可以參考下2023-07-07redis持久化AOF和RDB的區(qū)別及解決各個場景問題示例
這篇文章主要為大家介紹了redis持久化AOF和RDB的區(qū)別及解決各個場景問題示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08淺析Redis Sentinel 與 Redis Cluster
本文主要介紹Redis Sentinel 及 Redis Cluster的區(qū)別及用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-06-06Redis的數(shù)據(jù)類型和內(nèi)部編碼詳解
Redis是通過Key-Value的形式來組織數(shù)據(jù)的,而Key的類型都是String,而Value的類型可以有很多,在Redis中最通用的數(shù)據(jù)類型大致有這幾種:String、List、Set、Hash、Sorted Set,下面通過本文介紹Redis數(shù)據(jù)類型和內(nèi)部編碼,感興趣的朋友一起看看吧2024-04-04