天天看點

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

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的RDB和AOP持久化及配置Redis介紹RDBAOF總結

進入Redis用戶端并添加資料

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

關閉Redis

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

開啟Redis

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

進入Redis用戶端并擷取key

 可以發現我們在上面的資料已經丢失了,然後讓我們把Redis關掉在使用rdb試一下。

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

使用rdb

配置檔案配置rdb

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

啟動Redis

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

看一下在配置檔案中配置的持久化檔案存儲路徑下是否有rdb檔案

 可以看到該路徑下隻有一個pid檔案,該檔案是Redis啟動後存放pid的檔案,并沒有rdb檔案。

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

進入Redis用戶端,在20s内操作5次key并退出

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

看一下在配置檔案中配置的持久化檔案存儲路徑下是否有rdb檔案

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

關閉Redis

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

開啟Redis

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

進入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次記錄。

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

特點

  • 根據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

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

看一下在配置檔案中配置的持久化檔案存儲路徑下是否有aof檔案

&esmp;Redis開啟AOF後,啟動Redis後,Redis就會建立一個aof的檔案,但是檔案裡面什麼都沒有,是空的。

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

進入Redis用戶端并擷取一下key

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

看一下aof檔案中是否有讀操作的指令記錄

 可以看到aof中并沒有讀操作的指令,aof隻會記錄Redis的寫操作(添加,修改,删除)而不會去記錄讀操作。

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

在Redis用戶端添加資料

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

看一下aof中是否有添加記錄

 可以看到在aof檔案中有我們剛剛添加的k1 v1,k2 v2等資料,aop檔案中還有一個

SELECT

的單詞,這裡要注意一下,這個

SELETE

并不是SQL語句中的查詢,而是Redis的換庫指令。Redis共有16個庫,我們目前所處的是Redis的預設0号庫,在SELECT下面第二個有一個0,這代表0号庫,Redis的資料恢複也一定要注意這些資料是在哪個庫裡面存着的。

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

關閉Redis

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

啟動Redis

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

進入Redis用戶端檢視是否有資料

 可以看到,資料都恢複到了記憶體中。

Redis的RDB和AOP持久化及配置Redis介紹RDBAOF總結

特點

  • 将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叢集配置的時候,就會有一些更複雜的難度了。

繼續閱讀