Redis當然大家都很熟悉,但是在使用層面看不到的地方很容易被忽略。今天要和大家分享的是Redis中各種緩沖區的作用,溢出的後果以及優化方向。
在開始正文之前,我想多說幾句。無論Redis還是其他中間件,很多底層原理都是相似的,設計思路都是通用的。
如果妳以後在學習任何新的框架/組件,可以試著把它們和已經學過的知識點聯系起來,這樣會更容易理解,不要說死記硬背了。
比如現在說的緩沖區的目的是什麽?
沒有它,為了性能。
要麽緩存數據提高響應速度。例如,MySQL中有壹個更改緩沖區。
要麽擔心消費者的速度跟不上生產,害怕數據丟失。因此,需要臨時存儲生產數據。這就是Redis的緩沖劑的作用。
另外,消費者的速度跟不上。如果是同步處理,會不會也拖慢了生產者,所以這裏其實是在保證生產者的速度。
有的讀者可能會說:廢話,消費者跟不上,生產者有什麽用?
其實,有沒有可能消費者用的時候,生產者並不在意?前者負責處理後者需要什麽,給它什麽。生產者很忙,還有很多其他數據要處理,不能等消費者同時消費完了再做其他事情。
好像開頭擴大了壹點。我要了。下面我會詳細說壹下。如果妳有任何問題,請上車。七夕正式開始。
首先,Redis有什麽緩沖?
壹個*** 4:
服務器將為每個連接的客戶端設置壹個輸入緩沖區。
臨時存儲請求的數據。
輸入緩沖區將臨時存儲客戶端發送的命令,Redis主線程將從輸入緩沖區讀取命令並進行處理。
為了避免客戶端和服務器的發送和處理速度不匹配,這和後面要提到的輸出緩沖區是壹樣的。
首先,緩沖區是壹個固定大小的內存區域。如果要填充這個地方,Redis會直接關閉客戶端連接。
保護好自己。妳的客戶掛了總比我的服務器掛了好。壹旦服務器掛機,所有客戶端都沒用了。
那麽在填充緩沖器時有兩種情況:
然後將上述原則映射到Redis的場景中。
壹下子填滿的情況可以是將大量數據寫入Redis,數量級為百萬。
另壹種情況可能是Redis服務器由於耗時的操作而被阻塞,導致無法消耗輸入緩沖區數據。
對應以上兩種溢出場景,自然有優化方向。
在壹下子填滿的情況下,能不能考慮壹下子不寫那麽多數據,能不能把數據拆開(其實壹下子寫很多數據是不合理的)
另外,是否可以增加緩沖區的大小?
這其實是不可以的,因為沒有地方設置。目前,服務器為每個客戶機輸入緩沖區分配的默認大小是1GB。
然後是第二個溢出場景:兩邊處理速度不壹致。
正常情況下,服務器應該不會長時間阻塞,所以我們需要看看是什麽原因導致了阻塞,並解決它。
與輸入緩沖區壹樣,服務器也會為每個連接的客戶端設置壹個輸出緩沖區。
同上,它也是壹個臨時請求數據。
這個地方其實就是我在文章開頭說的。生產者不關心消費者什麽時候用,只負責處理消費者之前要求的東西。
服務器通常連接多個客戶端,redis網絡通信模塊是單線程的(即使新版本支持多線程)。
如果沒有輸出緩沖會怎麽樣?
服務器處理了很多來自客戶端A的請求,需要通過壹個耗時的網絡操作返回給客戶端A。在這個過程中,客戶端B的請求沒有得到服務器的處理和響應,所以吞吐量不會上去。
有了緩沖區,至少服務器可以解放出來處理客戶端b的請求。
這也是同壹個輸入緩沖區,我就不啰嗦了。如果溢出,服務器也會關閉客戶端連接。
同樣,不要壹次讀取大量數據;MONITOR命令不會連續在線執行。
輸出緩沖區的大小可以通過client-output-buffer-limit設置。
但是壹般來說我們不需要改,因為默認情況就夠了,知道這裏就好了。
溫馨提醒下,如果不了解Redis同步/復制,比如完全/增量復制的讀者,建議妳看看我的文章:壹篇文章讓妳了解Redis主從同步。
讓我們回到正題。
有復制就要有主從,主從之間的數據復制包括全量復制和增量復制。
全復制是同步所有數據,而增量復制只會在主從庫網絡斷開時,將主庫收到的命令同步到從庫。
臨時數據。
在主節點上為每個從節點維護壹個復制緩沖區。
在滿量程復制時,主節點在向從節點傳輸RDB文件的同時,會繼續接收客戶端發送的寫命令請求,並保存在復制緩沖區中,待RDB文件傳輸完成後,再發送給從節點執行。
從節點接收和加載RDB的速度很慢,同時主節點接收到大量的寫命令,這些寫命令會在復制緩沖區中累積,最終溢出。
壹旦溢出,主節點會直接關閉與從節點的連接進行復制操作,導致完全復制失敗。
可以將主節點的數據量控制在2~4GB(僅供參考),這樣可以使滿量程同步執行更快,避免復制緩沖區堆積過多命令。
您還可以調整緩沖區大小,或者之前的客戶端輸出緩沖區限制參數。
例如:config set client-output-buffer-limit slave 512mb 128 MB 60。
這是新副本中使用的緩沖區。
臨時數據。
當從節點意外斷開並重新連接時,在此期間未同步的數據可以從該緩沖器同步。
不會溢出來。(出乎意料。jpg)
緩沖區本質上是壹個固定長度的先進先出隊列,默認值為1MB。
所以當隊列滿了,不是錯誤,也不像上面的緩沖區直接關閉連接。相反,它會覆蓋首先進入隊列的數據。
因此,如果從節點沒有同步這些舊命令數據,它將導致主節點和從節點完全復制,而不是增量復制。
調整復制積壓緩沖區的大小。參數是repl_backlog_size。