Redis介紹
Redis是一個記憶體型的NoSql非關系型資料庫,它将所有的資料存儲在記憶體中進行讀寫操作,這也是Redis為什麼非常快的原因之一。但是當Redis服務重新開機、電腦重新開機、電腦當機等原因,Redis在記憶體中存儲的資料就會丢失(不可找回),記憶體雖然快但是重新開機之後記憶體中的資料就被清楚了。是以Redis就提供了兩種持久化(将資料存儲到磁盤上)方案,分别是
RDB
和
AOF
,目的都是在重新開機Redis服務時根據磁盤檔案将資料恢複到記憶體中,繼續提供資料服務,各位童鞋也可以參照:Redis持久化官方文檔。
RDB
介紹
RDB持久化方式能夠在指定的時間間隔能對你的資料進行快照存儲。
配置
在Redis的
redis.conf
配置檔案中RDB是預設開啟的。
# 配置持久化檔案存儲路徑
dir "/var/redis-5.0.5/data"
# 配置rdb
# 20s 對key做了5次操作就會進行快照存儲,可以配置多個,隻要有一個條件成立就會快照
save 20 5
save 300 10
save 60 10000
# rdb檔案名 用預設的即可
dbfilename dump.rdb
示範
不使用rdb
啟動Redis
進入Redis用戶端并添加資料
關閉Redis
開啟Redis
進入Redis用戶端并擷取key
可以發現我們在上面的資料已經丢失了,然後讓我們把Redis關掉在使用rdb試一下。
使用rdb
配置檔案配置rdb
啟動Redis
看一下在配置檔案中配置的持久化檔案存儲路徑下是否有rdb檔案
可以看到該路徑下隻有一個pid檔案,該檔案是Redis啟動後存放pid的檔案,并沒有rdb檔案。
進入Redis用戶端,在20s内操作5次key并退出
看一下在配置檔案中配置的持久化檔案存儲路徑下是否有rdb檔案
關閉Redis
開啟Redis
進入Redis用戶端并擷取key
我在20s内寫到了 k7,但是可以看到Redis重新開機之後恢複到記憶體中的資料隻有5個,是因為這五個是我在20s之内操作的,Redis的RDB記錄下來了。另外三個資料的丢失,有一個是因為在20s之外操作的是以沒有記錄,如果想要記錄下來的話,那麼在配置檔案裡可以加上
save 1 1
,這代表在1s内操作1次就會記錄下來,還有兩個雖然是在20s之内操作的但是也沒有記錄,是因為我們在配置檔案中隻設定了三個記錄的條件,分别為20s操作5次記錄、300s操作10次記錄、60s操作10000次記錄;很顯然,丢失的那兩個資料并沒有條件成立,是以資料就會丢失,解決辦法有兩個:一個是加上
save 20 7
,20s内操作7次記錄,另一個就是加上
save 3 2
,3s内操作2次記錄。
特點
- 根據save的配置,在指定時間範圍内對key操作達到指定次數才會對記憶體做快照
- 如果你想立馬對記憶體做快照可以使用 save 指令
- 啟動Redis時根據配置檔案中的
和dir
找到快照檔案将資料存恢複到記憶體中dbfilename
- 有可能丢失一段時間内的資料,快照檔案中隻有資料,恢複資料是很快的
RDB的優點
- RDB是一個非常緊湊的檔案,它儲存了某個時間點得資料集,非常适用于資料集的備份,這樣即使出了問題你也可以根據需求恢複到不同版本的資料集。
- RDB是一個緊湊的單一檔案,很友善傳送到另一個遠端資料中心或者亞馬遜的S3(可能加密),非常适用于災難恢複。
- RDB在儲存RDB檔案時父程序唯一需要做的就是fork出一個子程序,接下來的工作全部由子程序來做,父程序不需要再做其他IO操作,是以RDB持久化方式可以最大化redis的性能。
- 與AOF相比,在恢複大的資料集的時候,RDB方式會更快一些。
RDB的缺點
- 如果你希望在redis意外停止工作(例如電源中斷)的情況下丢失的資料最少的話,那麼RDB不适合你.雖然你可以配置不同的save時間點(例如每隔5分鐘并且對資料集有100個寫的操作),是Redis要完整的儲存整個資料集是一個比較繁重的工作,你通常會每隔5分鐘或者更久做一次完整的儲存,萬一在Redis意外當機,你可能會丢失幾分鐘的資料。
- RDB 需要經常fork子程序來儲存資料集到硬碟上,當資料集比較大的時候,fork的過程是非常耗時的,可能會導緻Redis在一些毫秒級内不能響應用戶端的請求.如果資料集巨大并且CPU性能不是很好的情況下,這種情況會持續1秒,AOF也需要fork,但是你可以調節重寫日志檔案的頻率來提高資料集的耐久度。
AOF
介紹
AOF持久化方式記錄每次對伺服器寫的操作,當伺服器重新開機的時候會重新執行這些指令來恢複原始的資料,AOF指令以redis協定追加儲存每次寫的操作到檔案末尾,Redis還能對AOF檔案進行背景重寫,使得AOF檔案的體積不至于過大,AOF預設是關閉的,需要開啟。
配置
# 配置持久化檔案存儲路徑
dir "/var/redis-5.0.5/data"
# 開啟aof
appendonly yes
# 檔案名
appendfilename "appendonly.aof"
# 持久化政策,no:不同步,everysec:每秒一次,always:總是同步,速度比較慢
# appendfsync always
appendfsync everysec
# appendfsync no
示範
開啟Redis
看一下在配置檔案中配置的持久化檔案存儲路徑下是否有aof檔案
&esmp;Redis開啟AOF後,啟動Redis後,Redis就會建立一個aof的檔案,但是檔案裡面什麼都沒有,是空的。
進入Redis用戶端并擷取一下key
看一下aof檔案中是否有讀操作的指令記錄
可以看到aof中并沒有讀操作的指令,aof隻會記錄Redis的寫操作(添加,修改,删除)而不會去記錄讀操作。
在Redis用戶端添加資料
看一下aof中是否有添加記錄
可以看到在aof檔案中有我們剛剛添加的k1 v1,k2 v2等資料,aop檔案中還有一個
SELECT
的單詞,這裡要注意一下,這個
SELETE
并不是SQL語句中的查詢,而是Redis的換庫指令。Redis共有16個庫,我們目前所處的是Redis的預設0号庫,在SELECT下面第二個有一個0,這代表0号庫,Redis的資料恢複也一定要注意這些資料是在哪個庫裡面存着的。
關閉Redis
啟動Redis
進入Redis用戶端檢視是否有資料
可以看到,資料都恢複到了記憶體中。
特點
- 将Redis服務寫指令,存儲在aof檔案中,并且包含select換庫指令
- 預設關閉,需要修改配置打開
- 與RDB一起存在恢複資料時優先使用aof
優點
- 使用AOF 會讓你的Redis更加耐久::你可以使用不同的fsync政策:無fsync,每秒fsync,每次寫的時候fsync。使用預設的每秒fsync政策,Redis的性能依然很好(fsync是由背景線程進行處理的,主線程會盡力處理用戶端請求),一旦出現故障,你最多丢失1秒的資料。
- 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 檔案的體積通常要大于 RDB 檔案的體積。
-
根據所使用的 fsync 政策,AOF 的速度可能會慢于 RDB 。 在一般情況下, 每秒 fsync 的性能依
然非常高, 而關閉 fsync 可以讓 AOF 的速度和 RDB 一樣快, 即使在高負荷之下也是如此。 不過
在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間(latency)。
總結
Redis的持久化東西還是蠻多的,隻是配置相對簡單一些,這些是一些基礎的配置,後面如果Redis做一些主從複制,Redis Cluster叢集配置的時候,就會有一些更複雜的難度了。