淘淘商城——Redis持久化方案
Redis中設定key的過期時間
Redis中的expire命令用於設定key的過期時間,以毫秒計。key過期後將不再可用。Redis中的expire命令基本語法如下:
expire key second
設定成功返回1。當key不存在或者不能為key設定過期時間時返回0。
設定key的過期時間成功後,我們還可使用ttl key
命令檢視key的有效期,如若返回正數,則說明正在倒計時;返回-1,則說明這個key是持久化的;返回-2,則說明這個key是不存在的。
最後,我們可使用persist key
命令來清除key的過期時間,使其持久化,如若返回0,則說明持久化沒成功;返回1,則說明持久化成功。
Redis持久化方案
Redis的所有資料都是儲存到記憶體中的,但Redis可以實現資料的持久化儲存,即將資料儲存到磁碟上。Redis的持久化儲存提供兩種方式:快照(RDB檔案)和追加式檔案(AOF檔案):
- RDB持久化方式會在一個特定的間隔儲存那個時間點的一個數據快照,它是Redis預設支援的持久化方案。
- AOF持久化方式則會記錄每一個伺服器收到的寫操作。在服務啟動時,這些記錄的操作會逐條執行從而重建出原來的資料。寫操作命令記錄的格式跟Redis協議一致,以追加的方式進行儲存。說得通俗一點,就是把所有對Redis資料庫操作的命令,即增刪改操作的命令,儲存到一個檔案中。資料庫恢復時把所有的命令執行一遍即可。
- Redis的持久化是可以禁用的,就是說你可以讓資料的生命週期只存在於伺服器的執行時間裡。
- 兩種方式的持久化是可以同時存在的,但是當Redis重啟時,AOF檔案會被優先用於重建資料。
快照(RDB檔案)是Redis預設支援的持久化方案,我們可以通過修改redis.conf配置檔案設定自動快照方式,rdb形式的預設配置如下:
從上圖可以看到Redis的配置檔案預設設定了3個儲存點,即使Redis如果在每N秒後資料發生了M次改變就儲存快照檔案。例如下面這個儲存點配置表示每60秒,如果資料發生了1000次以上的變動,Redis就會自動儲存快照檔案:
save 60 1000
我們要知道儲存點是可以設定多個的,Redis的redis.conf配置檔案就是這麼幹的,下面對這些儲存點做一點小小的闡述。
save 900 1
save 300 10
:300秒內如果發生超過10個key被修改,則發起快照儲存。save 60 10000
:60秒內如果發生超過10000個key被修改,則發起快照儲存。
此方式是將記憶體中的資料以快照的方式寫入到二進位制檔案中,預設檔名為dump.rdb,如下圖所示。
如果你需要備份資料庫的話,只須複製一份該檔案即可。
快照並不是很可靠。如果你的電腦突然宕機了,或者電源斷了,又或者不小心殺掉了程序,那麼最新的資料就會丟失。而AOF檔案則提供了一種更為可靠的持久化方式。每當Redis接受到會修改資料集的命令時,就會把命令追加到AOF檔案裡,當你重啟Redis時,AOF裡的命令會被重新執行一次,重建資料。
我們可以通過修改redis.conf配置檔案來開啟AOF配置,即把配置項appendonly設為yes,如下圖所示。
關於AOF的配置,redis.conf配置檔案中有幾項配置需要我們重點關注,如下。
appendonly yes
:啟用AOF持久化方式。appendfilename appendonly.aof
:AOF檔案的名稱,預設為appendonly.aof。appendfsync everysec
:每秒鐘強制寫入磁碟一次,在效能和持久化方面做了很好的折中,是受推薦的方式。
儲存以上修改之後,需要重啟redis才能生效。這時我們/redis/bin目錄中發現多了一個appendonly.aof檔案,但該檔案中是沒有任何資料的。
這時,兩種持久化方案同時開啟了,那麼當Redis重啟時,AOF檔案會被優先用於重建資料。如果大家不信,可使用./redis-cli
命令連線上redis服務,然後再使用keys *
命令檢視一下當前redis資料庫這裡面有多少個key,我們忽然發現一個key都沒有了,要知道當前redis資料庫是有key的啊!只不過是它們存放到了dump.rdb檔案當中了,這足以說明當Redis重啟時,AOF檔案會被優先用於重建資料。
現在我們使用set命令向當前redis資料庫中新增幾個key,接著按Ctrl+C
組合鍵退出該連線,最後使用ll
命令檢視一下bin目錄,可發現appendonly.aof檔案有資料了,如下圖所示。
如果要一探appendonly.aof檔案中的內容,可使用vim appendonly.aof
命令檢視,如下圖所示。
Redis的持久化方案,我就講到這裡為止了!