日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

面试官:Redis中的缓冲区了解吗

發布時間:2025/3/15 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试官:Redis中的缓冲区了解吗 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Redis 大家肯定不陌生,但在使用層面看不到的地方,就容易被忽略。今天想和大家分享的內容是 Redis 各個緩沖區的作用、溢出的后果及優化方向。

在開始正文前,想多叨叨幾句。不管是 Redis 還是其他中間件,底層很多原理都是相似的,設計思想都是通用的。

大家以后如果在學什么新框架/組件,可以盡量和已經學過的知識點進行聯想,這樣會更容易理解點的,不至于說死記硬背。

比如現在說到的緩沖區,它的目的是什么呢?

無它,為了性能。

要么緩存數據,提高響應速度。比如 MySQL 中有個 change buffer

要么擔心消費者速度跟不上生產,怕數據丟失。所以需要把生產數據先暫存起來。

Redis 的緩沖區就是這個作用。

另外,消費者速度跟不上,如果是同步處理的話,那是不是也會拖慢生產者,所以這里其實也是在保證生產者的速度。

可能有的讀者會說:扯淡,消費者都跟不上了,生產者再快有什么用?

其實有沒有一種可能,生產者根本不關心消費者什么時候用呢?前者是負責把后者需要的東西處理好給它就完事了。

生產者很忙,還有其他一大堆數據要處理,不能慢慢等消費者同步消費完才去做其他事情。

好像開頭擴展得有點多,我收一收,下面會詳細說到。有疑問的小伙伴請上車,七淅正式發車了。

1. 各緩沖區


首先 Redis 有什么緩沖區呢?

一共 4 個:

  • 客戶端輸入緩沖區

  • 客戶端輸出緩沖區

  • 復制緩沖區

  • 復制積壓緩沖區

2. 客戶端輸入緩沖區

服務器端會給每個連接的客戶端都設置了一個輸入緩沖區。

2.1 作用

暫存請求數據。

輸入緩沖區會先把客戶端發送過來的命令暫存起來,Redis 主線程再從輸入緩沖區中讀取命令,進行處理。

為了避免客戶端和服務器端的請求發送和處理速度不匹配,這點和等下要說的輸出緩沖區是一樣的。

2.2 溢出場景

首先緩沖區是一塊固定大小的內存區域,如果要把這個地方填滿的話,那 Redis 會直接把客戶端連接關閉。

保護自己嘛,你客戶端掛了總比我服務端掛了好,服務端一掛就是所有客戶端都沒用了。

那填滿緩沖區就有 2 個情況了:

  • 要么一下子填滿

  • 要么生產速度大于消費速度,慢慢被填滿

  • 那么把上述原理對應到 Redis 的場景。

    一下子填滿的情況可以是往 Redis 里寫大量數據,百萬千萬數量級那種。

    另一個情況可以是 Redis 服務端因執行耗時操作,阻塞住了,導致沒法消費輸入緩沖區數據。

    2.3 優化

    對應上面 2 個溢出場景,優化方向很自然就有了。

    一下子填滿的情況,是不是可以考慮不要一下子寫這么多數據,能否拆下數據(其實一下子寫大量數據本身就不合理哈)

    另外,是否可以調高緩沖區大小呢?

    這個其實是不行的哈,因為沒有可以設置的地方,目前服務端默認為每個客戶端輸入緩沖區分配的大小是 1GB。

    那輪到第 2 個溢出場景:兩邊處理速度不一致。

    正常來說,服務端不應該出現長時間阻塞,所以需要看看是什么原因導致的阻塞,解決到就好了。

    3. 客戶端輸出緩沖區

    同輸入緩沖區,服務器端也會給每個連接的客戶端都設置了一個輸出緩沖區。

    3.1 作用

    同上,也是暫存請求數據。

    這個地方其實我在文章開頭說的,生產者不關心消費者什么時候用,只負責把消費者之前請求的東西處理好就完事了。

    可能有點抽象,我是這么理解的,如果有不妥的地方可以留言糾正我一下。

    服務端一般都會和多個客戶端連接,加上 redis 網絡通信模塊是單線程的(即使是新版本支持多線程也一樣)

    假如沒有輸出緩沖區會發生什么事呢?

    服務端處理了很多客戶端 A 的請求,需要經過網絡這一耗時操作,返回給客戶端 A。在這個過程中,客戶端 B 的請求一直得不到服務端處理和響應,這樣吞吐量就上不去了。

    有了緩沖區之后,至少能解放服務端,讓它去處理客戶端 B 的請求。

    3.2 溢出場景

    這里也是同輸入緩沖區,我就不啰嗦了,溢出的話服務端也會關閉客戶端連接。

  • 服務器端返回了大量數據,一下子填滿了

  • 返回數據的速度太快,比如執行 MONITOR 命令,它會持續輸出監測到的各個命令操作

  • 緩沖區大小設置得不合理。

  • 3.3 優化

    類似的,不要一下子讀大量數據;不持續在線上執行 MONITOR 命令。

    而輸出緩沖區的大小是可以通過 client-output-buffer-limit 來設置的。

    但是一般來說,我們都不用改,因為默認情況就夠了,這里了解下就好。

    值得說一點的是,Redis 發布訂閱的消息也是在該緩沖區中,可以用下方參數來限制大小,比如:client-output-buffer-limit pubsub 8mb 2mb 60

    含義如下:

    • pubsub 表示對訂閱客戶端進行設置。換成 normal 則表示當前設置的是普通客戶端

    • 整個配置的含義是:實際占用的緩沖區大小要超過 8MB,或者連續 60 秒內對輸出緩沖區的寫入量超過 2MB 的話,服務端就會關閉客戶端連接。

    4. 復制緩沖區

    溫馨提示下,如果對 Redis 同步/復制不了解的讀者,比如不知道全量/增量復制,建議可以看下我這篇文章:一文讓你明白Redis主從同步

    下面回到正題哈。

    有復制肯定有主從,而主從間的數據復制包括全量復制和增量復制兩種。

    全量復制是同步所有數據,而增量復制只會把主從庫網絡斷連期間主庫收到的命令,同步給從庫。

    4.1 作用

    暫存數據。

    主節點上會為每個從節點都維護一個復制緩沖區。

    在全量復制時,主節點在向從節點傳輸 RDB 文件的同時,會繼續接收客戶端發送的寫命令請求,并保存在復制緩沖區中,等 RDB 文件傳輸完成后,再發送給從節點去執行。

    4.2 溢出場景

    從節點接收和加載 RDB 較慢,同時主節點接收到了大量的寫命令,寫命令在復制緩沖區中就會越積越多,最后就會溢出。

    一旦溢出,主節點會直接關閉和從節點進行復制操作的連接,導致全量復制失敗

    4.3 優化

    可以控制主節點數據量在 2~4GB(僅供參考),這樣可以讓全量同步執行得更快些,避免復制緩沖區累積過多命令

    也可以調整緩沖區大小,還是之前的 client-output-buffer-limit 參數。

    比如:config set client-output-buffer-limit slave 512mb 128mb 60

    • slave 參數表明該配置項是針對復制緩沖區的.

    • 整個配置的含義是:實際占用的緩沖區大小要超過 512MB,或者連續 60 秒內對輸出緩沖區的寫入量超過 128MB 的話,服務端就會關閉同步連接。

    5. 復制積壓緩沖區

    這個是在新增復制用到的緩沖區。

    PS:具體介紹還是推薦看上面提到的文章哈,寫到這里已經 3k+ 字了,頂不住啦~

    5.1 作用

    暫存數據。

    從節點意外斷開連接后重連,可從該緩沖區同步期間沒同步到的數據。

    5.2 溢出場景

    不會溢出(想不到吧.jpg)

    該緩沖區本質是一個固定長度,先進先出的隊列,默認 1MB。

    所以當隊列被占滿,不是報錯,也不像上面幾個緩沖區直接關閉連接。而是覆蓋最

    早進入隊列的數據。

    因此,如果有從節點還沒有同步這些舊命令數據,就會導致主從節點重新進行全量復制,而不是增量復制。

    PS:全量復制性能開銷遠大于增量復制

    5.3 優化

    調整復制積壓緩沖區的大小,參數是:repl_backlog_size

    有道無術,術可成;有術無道,止于術

    歡迎大家關注Java之道公眾號

    好文章,我在看??

    總結

    以上是生活随笔為你收集整理的面试官:Redis中的缓冲区了解吗的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。