1、RDB
1.1)、RDB是什麼?
- RDB,全稱Redis Database
- RDB是Redis進行持久化的一種方式,當然:Redis預設的持久化方式也是RDB
1.2)、Redis配置RDB
1.2.1)、編寫配置
-
注:保證自己的linux中安裝了docker和docker-compose,安裝教程連結如下:
-
另:老衲的方法是採用docker和docker-compose來進行安裝的Redis。官網讓下載壓縮包,然後安裝gcc,使用make編譯,從而安裝的方式,老衲並沒有採用
-
配製編寫如下:
version: '3.1'
services:
redis:
image: redis:6.2.6
restart: always
container_name: redis
environment:
- TZ=Asia/Shanghai
ports:
- 6379:6379
volumes:
- ./conf/:/usr/local/redis/
- ./conf/:/data/
command: ["redis-server","/usr/local/redis/redis.conf"]
- 然後儲存即可
1.2.2)、編寫RDB配置
-
注:老衲的Redis是已經啟動過了的,因此:接下來的一步如果看老衲部落格的人當初不是採用的docker和docker-compose安裝的Redis,那麼經過上面的步驟之後,啟動一下Redis就可以了,怎麼啟動這裡不做說明,可以看一下老衲的docker-compose安裝Redis教程,連結如下:
-
回到正題,編寫RDB配置
- 最後,儲存即可
# 設定redis登入密碼
requirepass 自己要設定的Redis登入密碼
# RDB設定
save 900 1
save 300 100
save 60 5 # 這裡使用5,是為了本部落格中好測試,這些後面不說了,因為:這是基操,說起來煩得很
dbfilename dump.rdb
1.2.3)、重新啟動Redis,進到Redis的docker容器內部
- 測試:觸發RDB,save自己設定的次數次資料即可
1.2.4)、回到對映的生成rdb檔案的目錄
- 經過如上的操作之後,RDB就配置成功了,但是:老衲想說的其實不是上面這些,接下來才是我想說的
2、Redis的RDB原理
3、RDB的觸發條件
-
1、肯定是使用save命令了( 先刪掉生成的rdb檔案,從而進行測試 )
-
可見:成功觸發了,後續的演示老衲不再做了,直說有哪些觸發條件
-
這個命令觸發RDB的原理:
- save命令會阻塞Redis伺服器程式,直到RDB檔案建立完畢為止,在Redis伺服器阻塞期間,伺服器不能處理任何命令請求
-
2、使用bgsave命令
-
這個命令也是推薦的一種,建立一個子程式,由子程式來負責建立RDB檔案,父程式(即Redis主程式)則繼續處理請求
-
注:bgsave命令執行過程中,只有fork子程式時會阻塞伺服器,而對於save命令,整個過程都會阻塞伺服器,因此save已基本被廢棄,線上環境要杜絕save的使用
-
-
3、自動觸發
- 這個就簡單了,所謂的自動觸發就是前面自己在redis.conf檔案中配置哪些save,滿足條件就觸發了嘛
-
4、使用flushall命令、以及退出Redis也會觸發( 先登進去,然後開另一個建立刪掉rdb檔案,再退出就發現也生成了 )
4、RDB的優缺點
- 缺點:
-
進行持久化時有一定的時間間隔( sava配置那裡 ),如果剛好在哪個時間點內在儲存資料,而此時出現當機了,則:會導致要儲存的資料沒有儲存成功( 不能保證資料的絕對安全 )
- 舉個例子:假如900內是有一次key發生改變就儲存資料,但是:在key正在準備改變時,redis當機了呢?這資料不就沒了嗎( redis的資料一開始是在記憶體中的,還沒持久化到磁碟 )
-
RDB是開了一個子程式來進行建立rdb檔案,因此:會造成空間的浪費
-
———————————————————官方話如下:—————————————————————————————
-
如果你希望在redis意外停止工作(例如電源中斷)的情況下丟失的資料最少的話,那麼RDB不適合你.雖然你可以配置不同的save時間點(例如每隔5分鐘並且對資料集有100個寫的操作),是Redis要完整的儲存整個資料集是一個比較繁重的工作,你通常會每隔5分鐘或者更久做一次完整的儲存,萬一在Redis意外當機,你可能會丟失幾分鐘的資料
-
RDB 需要經常fork子程式來儲存資料集到硬碟上,當資料集比較大的時候,fork的過程是非常耗時的,可能會導致Redis在一些毫秒級內不能響應客戶端的請求.如果資料集巨大並且CPU效能不是很好的情況下,這種情況會持續1秒,AOF也需要fork,但是你可以調節重寫日誌檔案的頻率來提高資料集的耐久度
-
優點:
- 適合大規模的資料恢復
- 持久化速度快,相對AOF來說:資料安全( 二進位制檔案嘛 )
—————————————————————官方話如下:—————————————————————————————
- RDB是一個非常緊湊的檔案,它儲存了某個時間點得資料集,非常適用於資料集的備份,比如你可以在每個小時報儲存一下過去24小時內的資料,同時每天儲存過去30天的資料,這樣即使出了問題你也可以根據需求恢復到不同版本的資料集
- RDB是一個緊湊的單一檔案,很方便傳送到另一個遠端資料中心或者亞馬遜的S3(可能加密),非常適用於災難恢復
- RDB在儲存RDB檔案時父程式唯一需要做的就是fork出一個子程式,接下來的工作全部由子程式來做,父程式不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的效能.
- 與AOF相比,在恢復大的資料集的時候,RDB方式會更快一些
2、AOF
2.1)、什麼是AOF
- 全稱:append only file
- AOF是Redis進行持久化的另外一種操作方式
2.2)、配置AOF
2.2.1)、編寫redis.conf檔案
- 編寫內容如下:
# 配置AOF
appendonly yes
appendfilename redis.aof
appendfsync everysec
# 下面這兩個是另外一種配置措施,一般都不考慮
# appendfsync always
# # appendfsync no
- appendfsync always:每執行一個寫操作,立即持久化到AOF檔案中,效能比較低
- appendfsync everysec:每秒執行一次持久化
- appendfsync no:會根據你的作業系統不同,環境的不同,在一定時間內執行一次持久化
2.2.2)、重啟Redis即可
- 重啟之後,測試如下:
2.2.3)、檢查資料卷對映的檔案目錄
-
可見:多出了 .aof檔案
-
檢視一下這個 aof檔案
- 發現:這個aof檔案中儲存的就是我們剛剛在redis中儲存key-value時的指令
-
還是老話,前面這些不是老衲想說的,下面的才是老衲準備說的內容
2、AOF的原理
3、AOF的觸發條件
- 一句話:只要配置了,那麼只要啟動Redis就會觸發( 可以把aof檔案刪掉,然後重啟Redis,再看對映檔案路徑,就會發現有了aof檔案 )
4、AOF的優缺點
- 缺點:
-
資料恢復慢( 大資料時,它是去重新執行一遍aof檔案中的資料 ,它存的是指令,是一個文字檔案,大資料時,這就會變得很大 ,但是:)
- 可以加入這個配置,從而限定:內容超過多大之後,就另起一個aof檔案來記錄內容[專業詞:重寫]( 重新寫一個aof檔案 )
-
—————————————————————官方話如下:—————————————————————————————
-
對於相同的資料集來說,AOF 檔案的體積通常要大於 RDB 檔案的體積
-
根據所使用的 fsync 策略,AOF 的速度可能會慢於 RDB 。 在一般情況下, 每秒 fsync 的效能依然非常高, 而關閉 fsync 可以讓 AOF 的速度和 RDB 一樣快, 即使在高負荷之下也是如此。 不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間(latency)
-
優點:
- 採用每修改一次key就同步的話,資料的完整性比較好
- 採用每秒同步一次的話,持久化也快,注:容易丟失這一秒的資料,對照RDB來看
- 採用從不同步的話,效率蠻高,但是:不建議
—————————————————————官方話如下:—————————————————————————————
-
AOF檔案是一個只進行追加的日誌檔案,所以不需要寫入seek,即使由於某些原因(磁碟空間已滿,寫的過程中當機等等)未執行完整的寫入命令,你也也可使用redis-check-aof工具修復這些問題
-
Redis 可以在 AOF 檔案體積變得過大時,自動地在後臺對 AOF 進行重寫: 重寫後的新 AOF 檔案包含了恢復當前資料集所需的最小命令集合。 整個重寫操作是絕對安全的,因為 Redis 在建立新 AOF 檔案的過程中,會繼續將命令追加到現有的 AOF 檔案裡面,即使重寫過程中發生停機,現有的 AOF 檔案也不會丟失。 而一旦新 AOF 檔案建立完畢,Redis 就會從舊 AOF 檔案切換到新 AOF 檔案,並開始對新 AOF 檔案進行追加操作
-
AOF 檔案有序地儲存了對資料庫執行的所有寫入操作, 這些寫入操作以 Redis 協議的格式儲存, 因此 AOF 檔案的內容非常容易被人讀懂, 對檔案進行分析(parse)也很輕鬆。 匯出(export) AOF 檔案也非常簡單: 舉個例子, 如果你不小心執行了 FLUSHALL 命令, 但只要 AOF 檔案未被重寫, 那麼只要停止伺服器, 移除 AOF 檔案末尾的 FLUSHALL 命令, 並重啟 Redis , 就可以將資料集恢復到 FLUSHALL 執行之前的狀態
-
注:AOF記錄的是每次寫操作,讀操作並不會記錄滴
3、建議
-
同時開啟rdb和aof
-
同時開啟RDB和AOF的注意事項:
- 如果同時開啟了AOF和RDB持久化,那麼在Redis當機重啟之後,需要載入一個持久化檔案,優先選擇AOF檔案。
- 如果先開啟了RDB,再次開啟AOF,如果RDB執行了持久化,那麼RDB檔案中的內容會被AOF覆蓋掉。