redis的兩種持久化的機制,你真的了解么?
redis提供了兩種持久化的機制 RDB和AOF機制
RDB(redis Database):RDB保存某一個時間點之前的快照數據。
AOF(Append-Only File):指所有的命令行記錄以redis命令請求協議的格式完全持久化存儲保存為AOF文件
混合持久化(4.0版本以后):指進行AOF重寫時子進程將當前時間點的數據快照保存為RDB文件格式,而后將父進程累計命令保存為AOF格式。
RDB快照有兩種觸發方式
1:為通過配置參數,如下:
通過一定的時間周日內看,命令執行的個數,超過閾值立即執行快照生成
save 900 1 //900秒內有1次更新
save 300 10 //30秒內有10次更新
save 60 10000 //60秒內有10000次更新
2:手動執行bgsave/save,手動觸發生成快照 直接執行save會阻塞主進程,bgsave的話會fork一個子進程完成快照
但是redis在發生RDB持久化的過程中有幾個問題需要思考
1.RDB快照過程中Redis是否會停止對外服務
2.如果不回停止服務,那如何處理新的請求
接下來我們看redis的
RDB持久化的具體過程
1:主進程會fork一個子進程
2:子進程會共享一部分主進程的數據空間,并且把共享的數據置為read-only的狀態,在這個過程中,子進程以rdb的協議來實行持久化
3:在持久化的過程中是避免不了有新的數據寫入的,因為我們有一部分的數據是共享的,兩個進程同時擁有一塊數據,肯定會導致數據不一致的問題, 但是依賴于操作系統的fork機制,在修改的時候一定是修改部分內存頁的數據,這個時候會觸發對應內存頁的copyonwrite的操作,不會影響子進程完 成持久化,持久化結束后,主進程會對子進程進行回收
RDB的文件格式
redis的rdb文件是一個非常緊湊的格式
開頭的REDIS是固定的一個格式,redis在讀取持久化文件的時候發現不是以REDIS開頭的會報錯
0006是RDB_VERSION當前RDB協議的版本
AUX_FIELD_KEY_VALUE_PAIRS是一些輔助的字段
data則為保存的數據,數據首先會選擇redis_db,db選擇之后就是鍵值對的數據,對應的鍵值對又會分為設置過過期時間和未設置過期時間的數據
RDB持久化的優點
1:二進制的數據非常緊湊,數據的恢復速度非常快
2:在持久化的過程中,性能最大化,fork子進程來完成寫操作,讓主進程繼續處理命令,使用單獨子進程來進行持久化,保證了redis的高性能
RDB持久化的缺點
1:數據安全性低,RDB是間隔一段時間進行持久化,如果持久化之間redis發生了故障,會發生數據丟失
2:linux fork之后,kernel把父進程中所有的內存頁權限都設置readonly,然后子進程的地址空間指向父進程。當父子進程都只讀內存時,相安無事。當其中某個進程寫內存時,CPU硬件檢測到內存頁是read-only的,于是觸發頁異常終端(page-fault),陷入kernal的一個中斷例程。中斷例程中,kernel的copyonwrite機制就會把觸發的異常頁復制一份,于是父子進程各自持有獨立的一份。如果這個時候有大量的寫入操作,會產生大量的分頁錯誤(頁異常中斷page-fault ),這樣就得耗費不少性能在復制上。
AOF持久化執行流程
通過appendonly yes開啟
Redis使用單線程響應命令,如果每次AOF文件命令都追加到磁盤,會極大的影響處理性能,所以Redis先寫入aof緩沖區,根據用戶配置的同步磁盤策略寫入aof文件中,可以通過appendfsync參數配置同步策略:含義如下
appendfsync always #表示每次更新操作后手動調用fsync()將數據寫入到磁盤
appendfsync everysec #表示每秒同步一次(折中方案,默認值)
appendfsync no #表述等操作系統進行數據緩存同步到磁盤(快速響應客戶端,不對AOF做數據同步,同步文件由操作系統負責,通常同步周期最長30S)
AOF重寫機制
隨著命令得不斷寫入AOF,文件會越來越大,為了解決這個問題Redis引入了AOF重寫機制壓縮文件體積。AOF文件重寫是把Redis進程內的數據轉化為寫命令同步到新AOF文件的過程,AOF重寫機制可以通過手動觸發了自動觸發
手動觸發:bgreweuteaof命令
自動觸發:
auto-aof-rewrite-percentage 100 #表示當前AOF文件空間和上一次重寫后AOF文件空間的比值(100%)
auto-aof-rewrite-min-size 64mb #代表AOF重寫時文件最小體積
AOF的優點:數據安全,AOF持久化可以配置appendfsync屬性,有always,每進行一次命令操作就記錄到aof文件中一次。
AOF的缺點:數據集比較大的時候,比RDB啟動效率低
混合持久化
可以通過aof-use-rdb-preamble yes開啟
加載時,首先會識別AOF文件是否以REDIS字符串開頭,如果是,就按照RDB格式加載,加載完RDB后繼續按AOF格式加載剩余部分。 混合式持久化方案兼顧了RDB的速度,和AOF的安全性
關注我的技術公眾號,每周都有優質技術文章推送。 微信掃一掃下方二維碼即可關注:
智能推薦
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
猜你喜歡
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...
styled-components —— React 中的 CSS 最佳實踐
https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...
19.vue中封裝echarts組件
19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...