1. 程式人生 > >【Redis詳解基礎篇三(持久化)】

【Redis詳解基礎篇三(持久化)】

前言

什麼是持久化

因為redis是存放在記憶體中的,所以我們的資料很可能會丟失。所以得讓他持久化的保留起來就肯定需要硬碟,也就是放到裝置上進行儲存

使用場景

如果你想用redis暫時性的存放一些資料,只是存放之後設定一個超時的時間,那麼你可以不需要redis的持久化機制

但是如果你想用redis來當做一個key value型的資料庫,那麼你必須使用持久化機制,否則時間會很容易的丟失,例如斷電等情況

redis的持久化機制就是讓記憶體中的資料以檔案的形式儲存在硬碟上

持久化的方式

  • RDB
  • AOF

RDB持久化

RDB指的是讓資料以二進位制的形式儲存在硬碟上

觸發RDB

  • SAVE
  • BGSAVE

SAVE與BGSAVE的區別

SAVE表示用當前的執行緒去儲存,阻塞
BGSAVE表示另開闢一個執行緒去執行,不會阻塞

所以上面的觀點可以看出對於SAVE如果是傳送SAVE就會導致客戶端的阻塞,幹不了其他的事情,但是BGSAVE可以完美的解決這個問題,因為BGSAVE靈開闢了一個執行緒,但是缺點就是BGSAVE太消耗效能
在這裡插入圖片描述

SAVE與BGSAVE使用場景

  • BGSAVE:適用於線上,高峰期,因為不會導致重啟伺服器
  • SAVE:半夜3點:這個時候可以使用SAVE,並且速度要比BGSAVE要快

缺點

由於採用的RDB的形式是把資料轉化為二進位制檔案儲存在硬碟上,如果是頻繁的轉換可以想象那io絕對是卡死,非常消耗效能,所以非常不推薦頻繁的使用RDB,但是如果這段時間你沒有轉換為二進位制檔案,是不是資料就丟失了呢?????

AOF持久化

AOF解決了RDB帶來的問題,它使用的方式是保留你再客戶端輸入的命令,也就是你輸入的命令全部會保留在一個檔案內,當你的資料丟失的時候,只需要執行這個檔案就可以還原了

在這裡插入圖片描述

AOF會丟失資料嗎

不要以為每次執行的命令儲存到AOF裡面就不會丟失資料,他也會丟失資料,只是概率比較小
一般來說在操作的時候,我們需要再作業系統中,為了執行系統呼叫的write函式,所以需要把內容寫到某個檔案內,但是為了提高效率。我們一般是先寫到buffer緩衝區中,然後再寫入到硬盤裡面,等到緩衝區填滿了,使用者執行fsync呼叫時將緩衝在裡面的內容真正的寫入到磁盤裡面,所以越早執行越好

如何控制redis丟失資料?

為了防止丟失資料,redis提供了AOF持久化機制中的appendfsync選擇,這個選項裡面有3個值
always,everysec,no

Always

他的意思是隻要有命令執行,則直接到磁碟上了

everysec

表示一秒執行一次fdatasync,將緩衝區裡面的命令寫入到磁碟上,所以如果宕機,也是丟失一秒的資料

No

伺服器不主動去呼叫哦fdatasync,而是由作業系統自己去呼叫緩衝區裡面的內容寫入到硬碟上,但是這種情況在宕機的時候,不會知道到底丟失了多少資料
執行速度
Always比everysec和no都要慢