Redis為什麼這麼快以及持久化機制

2022-09-16 17:48:11 字數 3607 閱讀 1036

1、首先我們談一下為什麼redis快:

一、 redis是純記憶體資料庫,一般都是簡單的訪問操作,執行緒占用的時間很多,時間的花費主要集中在io上,所以讀取速度快。

二、 再說一下io,redis使用的是非阻塞io,io多路復用,使用了單執行緒來輪詢描述符,將資料庫的開、關、讀、寫都轉換成了事件,減少了執行緒切換時上下文的切  換和競爭。

多路 i/o 復用模型是利用select、poll、epoll可以同時監察多個流的 i/o 事件的能力,在空閒的時候,會把當前執行緒阻塞掉,當有乙個或多個流有i/o事件時,就從阻塞態中喚醒,於是程式就會輪詢一遍所有的流(epoll是只輪詢那些真正發出了事件的流),並且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。這裡「多路」指的是多個網路連線,「復用」指的是復用同乙個執行緒。採用多路 i/o 復用技術可以讓單個執行緒高效的處理多個連線請求(儘量減少網路io的時間消耗),且redis在記憶體中運算元據的速度非常快(記憶體內的操作不會成為這裡的效能瓶頸),主要以上兩點造就了redis具有很高的吞吐量。

select和epoll的區別: 1、select支援的檔案描述符數量太小了,預設是1024,而epoll無限制;

2、當有a b c d4個流時,比如甲連線了a。阻塞模式,一直處理a知道完成/阻塞;select模式,甲請求後無請求事件,進入阻塞,一旦甲又來請求,開始輪詢比如d、b、c、a,找到a了處理,問題是如果有500個呢?所以會產生驚群問題;epoll是在同時保持abcd連線的同時,讓甲的請求事件驅動a,直接找到a連線開始處理,避免輪詢,問題是如果同時ac2個連線的請求都到了呢?redis採用線性事件串型化,讓ac進入佇列,然後非同步消費佇列進行處理,

三、 redis採用了單執行緒的模型,保證了每個操作的原子性,也減少了執行緒的上下文切換和競爭。

四、另外,資料結構也幫了不少忙,redis全程使用hash結構,讀取速度快,還有一些特殊的資料結構,對資料儲存進行了優化,如壓縮表,對短資料進行壓縮儲存      ,再如,跳表,使用有序的資料結構加快讀取的速度。

五、還有一點,redis採用自己實現的事件分離器,效率比較高,內部採用非阻塞的執行方式,吞吐能力比較大。

上述講到redis是基於記憶體操作的,那伺服器宕機了,那不是全完了,所以redis有自己的持久化操作,下面我們來講講redis的持久化

2、redis的持久化

1、rdb機制:

原理:rdb是預設開啟的,會按照配置的指定時間將記憶體中的資料快照到磁碟中,建立乙個dump.rdb檔案,redis啟動時再恢復到記憶體中。redis會單獨建立fork()乙個子程序,將父程序的資料複製到子程序的記憶體中,然後由子程序寫入到臨時檔案,再用這個臨時檔案替換上次的快照檔案,然後子程序退出,釋放記憶體。

注意每次快照持久化都會講主程序的資料複製一遍,會導致記憶體開銷加倍,若此時記憶體不足,則會阻塞伺服器執行,直到複製結束釋放記憶體;如果資料量過大,而且寫操作頻繁,必然會引起大量的磁碟操作,嚴重影響效能,並且最後一次持久化會消失。(順便一提,影響redis的效能主要是磁碟操作)

2、aof機制:

原理:以日誌的形式記錄每個寫操作(讀操作不記錄),只需追加檔案但不可改寫檔案,redis啟動時會根據日誌從頭到尾全部載入到記憶體中。

注意:因為aof採用追加的方式,所以檔案會越來越大,針對這個問題,新增了重寫機制,就是當日誌檔案大到一定程度的時候,會fork出一條新程序來遍歷程序記憶體中的資料,每條記錄對應一條set語句,寫到臨時檔案中,然後替換舊的日誌檔案,預設觸發是當aof檔案大小是上次重啟大小的一倍且當檔案大於64m的時候。

3、二者優缺點:

rdb存在哪些優勢呢?

1). 一旦採用該方式,那麼你的整個redis資料庫將只包含乙個檔案,這對於檔案備份而言是非常完美的。比如,你可能打算每個小時歸檔一次最近24小時的資料,同時還要每天歸檔一次最近30天的資料。通過這樣的備份策略,一旦系統出現災難性故障,我們可以非常容易的進行恢復。

2). 對於災難恢復而言,rdb是非常不錯的選擇。因為我們可以非常輕鬆的將乙個單獨的檔案壓縮後再轉移到其它儲存介質上。

3). 效能最大化。對於redis的服務程序而言,在開始持久化時,它唯一需要做的只是fork出子程序,之後再由子程序完成這些持久化的工作,這樣就可以極大的避免服務程序執行io操作了。

4). 相比於aof機制,如果資料集很大,rdb的啟動效率會更高。

rdb又存在哪些劣勢呢?

1). 如果你想保證資料的高可用性,即最大限度的避免資料丟失,那麼rdb將不是乙個很好的選擇。因為系統一旦在定時持久化之前出現宕機現象,此前沒有來得及寫入磁碟的資料都將丟失。

2). 由於rdb是通過fork子程序來協助完成資料持久化工作的,因此,如果當資料集較大時,可能會導致整個伺服器停止服務幾百毫秒,甚至是1秒鐘。

aof的優勢有哪些呢?

1). 該機制可以帶來更高的資料安全性,即資料永續性。redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事實上,每秒同步也是非同步完成的,其效率也是非常高的,所差的是一旦系統出現宕機現象,那麼這一秒鐘之內修改的資料將會丟失。而每修改同步,我們可以將其視為同步持久化,即每次發生的資料變化都會被立即記錄到磁碟中。可以預見,這種方式在效率上是最低的。至於無同步,無需多言,我想大家都能正確的理解它。

4). aof包含乙個格式清晰、易於理解的日誌檔案用於記錄所有的修改操作。事實上,我們也可以通過該檔案完成資料的重建。

aof的劣勢有哪些呢?

1). 對於相同數量的資料集而言,aof檔案通常要大於rdb檔案。rdb 在恢復大資料集時的速度比 aof 的恢復速度要快。

2). 根據同步策略的不同,aof在執行效率上往往會慢於rdb。總之,每秒同步策略的效率是比較高的,同步禁用策略的效率和rdb一樣高效。

二者選擇的標準,就是看系統是願意犧牲一些效能,換取更高的快取一致性(aof),還是願意寫操作頻繁的時候,不啟用備份來換取更高的效能,待手動執行s**e的時候,再做備份(rdb)。rdb這個就更有些 eventually consistent的意思了。

4、常用配置

rdb持久化配置

redis會將資料集的快照dump到dump.rdb檔案中。此外,我們也可以通過配置檔案來修改redis伺服器dump快照的頻率,在開啟6379.conf檔案之後,我們搜尋s**e,可以看到下面的配置資訊:

s**e 900 1              #在900秒(15分鐘)之後,如果至少有1個key發生變化,則dump記憶體快照。

s**e 300 10            #在300秒(5分鐘)之後,如果至少有10個key發生變化,則dump記憶體快照。

s**e 60 10000        #在60秒(1分鐘)之後,如果至少有10000個key發生變化,則dump記憶體快照。

aof持久化配置

在redis的配置檔案中存在三種同步方式,它們分別是:

5、參考資料

Redis為什麼這麼快?

今天我在乙個技術群裡提出乙個問題 redis為什麼這麼快,redis的那些特性能夠支援了它的高併發?之前的我,也只是知道redis是記憶體資料庫,所以讀取速度快 io使用的是多路復用,使用乙個執行緒來輪詢描述符,減少了執行緒上下文的切換,將資料庫的開 關 讀 寫都轉化成了時間,所以io時也有加速。雖...

Redis為什麼這麼快?

1 完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似於hashmap,hashmap的優勢就是查詢和操作的時間複雜度都是o 1 2 資料結構簡單,對資料操作也簡單,redis中的資料結構是專門進行設計的 3 採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多...

Redis為什麼這麼快?

目錄 一 redis為什麼這麼快?二 redis為什麼是單執行緒的?redis採用的是基於記憶體的採用的是單程序單執行緒模型的 kv 資料庫,由c語言編寫,官方提供的資料是可以達到100000 的qps 每秒內查詢次數 以下幾點造就了redis非常快的特點 採用單執行緒避免了不必要的上下文切換和競爭...