我們知道redis是記憶體資料庫,存的資料是放在記憶體中,所以我們需要把資料也存到硬碟里,防止redis掛了之后,我們還能找到其中的資料;
那么問題來了, 怎么持久化啊?
我們可以把redis想象成一個房間,每一個存到其中的資料看成一個個的人,你覺得怎么統計這個房間里的人比較好呢?
第一種方式:我們直接進去用手機拍照,將所有人都拍下來就好了,然后我們隨時可以看到房間里都有誰在,但是因為房門是開的,會不斷的有人進來也,有人消失了,我們總不可能一直拿著手機在瘋狂的拍照吧!別人肯定以為你是變態,就報警來抓你了....
這種方式需要每隔一段時間就去拍照一下,所以也叫做快照(Snapshot),在redis中叫做RDB;但是可想而知,因為每隔一段時間才去拍照,所以,在這個時間間隔之內我們是沒辦法知道新進去了哪些人的;
第二種方式:直接進房間里拍照好蠢,尼瑪一不小心就被抓了,但是可以直接站在門口啊,每進去一個人我們就把這個人名字寫在一個小本本中
這種方式無論什么時刻都可以知道房間里都有什么人,但是如果進去的人比較多,可能你的小本本就很大,這么多名字,此處空白太小,寫不下了( ̄▽ ̄)ノ;
在redis中叫做AOF,每一次使用redis的時候,都會將寫命令記載在日志檔案中,即使redis掛了,根據日志檔案執行一遍所有命令就行了
1. RDB
redis默認的持久化方式,下圖所示,就是這個rdb檔案

想要觸發redis服務端的rdb持久化,也是要條件的;
1.1 客戶端向服務端發起持久化命令
當客戶端執行bgsave或者save的時候,redis服務端接受到命令之后,就會將redis中的資料存一份到硬碟中形成rdb檔案,這兩個命令的區別:

bgsave: 非阻塞,redis服務端接收到basave指令的時候,還能繼續接受其他redis客戶端的指令;因為redis服務端接收到這個指令就會去fork一個子行程去做持久化,redis服務端還是照常使用
save: 阻塞,redis服務端接受到save指令,redis就不能用了,只能等到持久化完畢才能繼續使用;因為redis服務端只在做持久化了


1.2 服務端自行進行持久化
在專案中我們肯定不可能自己去手動發送bgsave命令到redis服務端吧,最好是當redis中的鍵值對滿足一定的條件后就自動的觸發bgsave,fork一個子行程去持久化資料;
所以我們在redis安裝目錄下,打開組態檔redis.windows.conf,看到下面這里,只需要滿足任意一個,就能觸發RDB,我們自己測驗的話可以弄個小的,比如save 5 2 在5秒內有兩個key發生變化就會觸發RDB持久化,然后重啟redis服務端;
注意,這里觸發的是bgsave


1.3 客戶端發送shutdown指令
客戶端發送shutdown指令,讓redis服務端關閉,此時就會觸發一次save
2. AOF
2.1 aof原理
RDB持久化已經不錯了,但是在兩次持久化間隔期間如果redis服務端掛了,那么間隔這段時間的資料就丟失了,所以才有了AOF持久化
下圖所示,只會將寫命令都存到一個檔案中去;

2.2 aof開啟
默認是不開啟aof持久化的,我們需要到組態檔中修改一下,重啟redis,下圖所示:

然后我們隨便使用set a 1 然后就會看到生成aof檔案了

有興趣的可以看看這個aof檔案中是什么,很簡單,redis遵循的resp協議,只有遵守這個協議,redis服務端才會正確決議命令,想了解的的可以看看這里
我們就看幾個簡單的:

2.3 aof持久化頻率
之前說過會將每個寫命令都同步到aof檔案中,難道一有寫操作就同步一次嗎?
假如一百個客戶端在一秒鐘都使用了一次寫操作,難道一秒鐘就要同步一百次么?這也太坑爹了
組態檔中有三種方式,下圖所示,就用默認的這種就行了,一秒鐘同步一次aof檔案,這樣有個好處,即使redis掛了,頂多丟失一秒鐘的資料;

2.4 aof檔案的重寫
我們可以知道隨著redis用的時間越來越長,aof檔案肯定會越來越大,當一個aof檔案有幾百G的時候,去加載它估計也要好半天;
所以redis可以設定將aof檔案給壓縮一下,舉個例子:呼叫5次incr a,那么可以直接壓縮為set a 7

通過aof這種重寫,可以在一定程度上減少aof檔案的體積,可以有兩種方式開啟aof檔案重寫:
第一種: redis客戶端使用 bgrewriteaof命令
第二種: 服務端組態檔配置下面兩個引數,注意這個百分數是100%,假如當64兆的aof檔案重寫為了50兆,那么第二次觸發重寫就必須到100兆;然后假設100兆又重寫為80兆,那么第三次觸發重寫必須等到aof檔案到160兆...

重寫的原理: 不是去修改原有的aof檔案,而是將此時redis中的所有存在的資料用命令給重寫一遍到一個新的aof檔案,然后將原來的那個aof檔案替換就行了;

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/253819.html
標籤:Java
上一篇:構造器詳解
