一、持久化的作用
1.什麼是持久化
redis的所有資料保存在記憶體中,資料的更新將非同步的儲存到硬碟上
2.持久化的實作方式
快照:某時某一刻資料的一個完成備份 -mysql的Dump -redis的RDB寫日誌:任何作業記錄日誌,要恢復數據,只要把日誌重新走一遍即可 -mysql的Binlog -Hhase的HLog # -Redsql的Binlog -Hhase的HLog # -Redsql#AOF
4複雜度o(n)第二種:bgsave(異步,Backgroud saving started)在外##A
二、RDB
1.什麼是RDB 2.觸發機制-主要三種方式第一種:save(同步)
1 用戶端輸入save指令----》redis服務端----》同步創建RDB二進位檔案
2 會造成redis的阻塞(資料量非常大的時候)
3 檔案策略:如果老的RDB存在,會取代舊的
1 客戶端輸入save指令----》redis服務端----》異步建立RDB二進位(fork函數產生一個子程序(fork會阻塞reids),執行createRDB,執行成功,回傳至reids訊息)
2 此時存取redis,會正常回應客戶端
3 檔案策略:跟save相同,如果老的RDB存在,會取代舊的
4 複雜度o(n)
第三種:(常用方式)(** ****)自動(透過設定檔)
設定 seconds changessave 900 1save 300 10save 60 改變了10條數據,自動產生rdb
如果900s改變了1條數據,自動產生rdb以上三條符合任一條,就自動產生rdb,內部使用bgsave
##設定:save 900 1 #設定一條
save 300 10 #設定一條save 60 10000 #設定一條
dbfilename dump.rdb #rdb檔案的名字,預設為dump.rdb
dir ./ #rdb檔案存在當前目錄stop-writes-on-bgsave-error yes #如果bgsave出現錯誤,是否停止寫入,預設為yes
rdbcompression yes #採用壓縮格式
rdbchecksum yes #是否對rdb檔案進行校驗與檢定
##最佳設定
save 900 1
save 300 10
save 60 10000 dbfilename dump-${port}.rdb
#以連接埠號當檔名,可能一台機器上很多reids,不會亂
dir /bigdiskpath #儲存路徑放到一個大硬碟位置目錄stop-writes-on-bgsave-error yes
#出現錯誤停止rdbcompression yes #壓縮
rdbchecksum yes #校驗
RDB觸發機制一般使用第三種方式,但是這種方式也會有缺點。如果修改的條數沒有在設定範圍內那麼就不會觸發,就會引發很多資料沒有持久化的情況。所以我們一般會採用下面方式:AOF。
如果是保存不重要的資料可以使用RDB方式(例如快取資料),如果是保存很重要的資料就要使用AOF,但兩種方式也可以同時使用。
三、AOF
1.RDB問題耗時,耗效能。不可控,可能會遺失資料。 #########2.AOF介紹######客戶端每寫入一條指令,都記錄一筆日誌,放到日誌檔案中,如果出現宕機,可以將資料完全恢復## #######3.AOF的三個策略######日誌不是直接寫到硬碟上,而是先放在緩衝區,緩衝區根據一些策略,寫到硬碟上#### ###第一種:always:redis--》寫入指令刷新的緩衝區---》每個指令fsync到硬碟---》AOF檔#######第二種:everysec(預設值):redis——》寫指令刷新的緩衝區---》每秒把緩衝區fsync到硬碟--》AOF檔#######第三種:no:redis——」寫指令刷新的緩衝區---》作業系統決定,緩衝區fsync到硬碟--》AOF檔####always | everysec | no | |
優點 | 不遺失資料 |
每秒一次fsync,遺失1秒資料 | 不用管 |
缺點 |
IO開銷大,一般的sata碟只有幾百TPS | #丟1秒資料 | 不可控 |
4.AOF重寫
隨著指令的逐步寫入,並發量的變大, AOF檔案會越來越大,透過AOF重寫來解決該問題
#原生AOF | ##AOF重寫 |
set hello world set hello java #set hello hehe incr counter ncr counter rpush mylist a rpush mylist b rpush mylist c 過期資料 |
#set hello hehe set counter 2 set counter 2
|
#本質就是把過期的,無用的,重複的,可以優化的指令,來優化這樣可以減少磁碟佔用量,加速恢復速度
實作方式
bgrewriteaof:客戶端向服務端發送bgrewriteaof指令,服務端會起一個fork進程,完成AOF重寫
AOF重寫設定:AOF設定檔(******) | appendonly yes #將該選項設為yes,開啟appendfilename "appendonly-${port}.aof " #檔案保存的名字appendfsync everysec #採用第二種策略dir /bigdiskpath #存放的路徑no-appendfsync-on-rewrite yes #在aof重寫的時候,是否要做aof的append操作,因為aof重寫消耗效能,磁碟消耗,正常aof寫磁碟有一定的衝突,這段期間的數據,允許遺失 | #四、RDB和AOF的選擇 | 1.rdb與aof的比較
指令 |
||
aof |
啟動優先權 |
|
高(掛掉重啟,會載入aof的資料) |
體積 |
|
#大 |
恢復速度 |
|
慢 |
2.rdb最佳策略
rdb關掉,主從操作時
集中管理:按天,按小時備份資料
主從配置,從節點開啟
3.aof最佳策略
開:快取和存儲,大部分情況都打開,
aof重寫集中管理
everysec:透過每秒刷新的策略
4.最佳策略
小分片:每個redis的最大記憶體為4g
快取或儲存:根據特性,使用不通策略
時時監控硬碟,內存,負載網路等
有足夠內存
以上就是Redis(四)-持久化方案(RDB和AOF使用)的全部內容。
相關參考:PHP中文網
以上是Redis如何實現持久化方案(RDB和AOF使用)的詳細內容。更多資訊請關注PHP中文網其他相關文章!