久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Redis處理客戶端連接的方法

127次閱讀
沒有評論

共計 3508 個字符,預計需要花費 9 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章給大家分享的是有關 Redis 處理客戶端連接的方法的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,一起跟隨丸趣 TV 小編過來看看吧。

Redis 如何處理客戶端連接 本文主要介紹了 Redis 處理客戶端連接的一些內部實現機制,包括連接處理、超時、緩沖區等一系列內容。下面丸趣 TV 丸趣 TV 小編來講解下 Redis 如何處理客戶端連接?

Redis 如何處理客戶端連接

Redis 通過監聽一個 TCP 端口或者 Unix socket 的方式來接收來自客戶端的連接,當一個連接建立后,Redis 內部會進行以下一些操作:

首先,客戶端 socket 會被設置為非阻塞模式,因為 Redis 在網絡事件處理上采用的是非阻塞多路復用模型。

然后為這個 socket 設置 TCP_NODELAY 屬性,禁用 Nagle 算法

然后創建一個 readable 的文件事件用于監聽這個客戶端 socket 的數據發送

當客戶端連接被初始化后,Redis 會查看目前的連接數,然后對比配置好的 maxclients 值,如果目前連接數已經達到最大連接數 maxclients 了,那么說明這個連接不能再接收,Redis 會直接返回客戶端一個連接錯誤,并馬上關閉掉這個連接。

服務端處理順序

如果有多個客戶端連接上 Redis,并且都向 Redis 發送命令,那么 Redis 服務端會先處理哪個客戶端的請求呢? 答案其實并不確定,主要與兩個因素有關,一是客戶端對應的 socket 對應的數字的大小,二是 kernal 報告各個客戶端事件的先后順序。

Redis 處理一個客戶端傳來數據的步驟如下:

它對觸發事件的 socket 調用一次 read(),只讀一次(而不是把這個 socket 上的消息讀完為止),是為了防止由于某個別客戶端持續發送太多命令,導致其它客戶端的請求長時間得不到處理的情況。

當然,當這一次 read() 調用完成后,它里面無論包含多少個命令,都會被一次性順序地執行。這樣就保證了對各個客戶端命令的公平對待。

關于最大連接數 maxclients

在 Redis2.4 中,最大連接數是被直接硬編碼在代碼里面的,而在 2.6 版本中這個值變成可配置的。maxclients 的默認值是 10000,你也可以在 redis.conf 中對這個值進行修改。

當然,這個值只是 Redis 一廂情愿的值,Redis 還會照顧到系統本身對進程使用的文件描述符數量的限制。在啟動時 Redis 會檢查系統的 soft limit,以查看打開文件描述符的個數上限。如果系統設置的數字,小于咱們希望的最大連接數加 32,那么這個 maxclients 的設置將不起作用,Redis 會按系統要求的來設置這個值。(加 32 是因為 Redis 內部會使用最多 32 個文件描述符,所以連接能使用的相當于所有能用的描述符號減 32)。

當上面說的這種情況發生時(maxclients 設置后不起作用的情況),Redis 的啟動過程中將會有相應的日志記錄。比如下面命令希望設置最大客戶端數量為 100000,所以 Redis 需要 100000+32 個文件描述符,而系統的最大文件描述符號設置為 10144,所以 Redis 只能將 maxclients 設置為 10144 – 32 = 10112。

$ ./redis-server –maxclients 100000

Redis 如何處理客戶端連接

[41422] 23 Jan 11:28:33.179 # Unable to set the max number of files limit to 100032 (Invalid argument), setting the max clients configuration to 10112.

所以說當你想設置 maxclients 值時,最好順便修改一下你的系統設置,當然,養成看日志的好習慣也能發現這個問題。

具體的設置方法就看你個人的需求了,你可以只修改此次會話的限制,也可以直接通過 sysctl 修改系統的默認設置。如:

ulimit -Sn 100000 # This will only work if hard limit is big enough.

sysctl -w fs.file-max=100000

輸出緩沖區大小限制

對于 Redis 的輸出 (也就是命令的返回值) 來說,其大小經常是不可控的,可能是一個簡單的命令,能夠產生體積龐大的返回數據。另外也有可能因為執行命令太多,產生的返回數據的速率超過了往客戶端發送的速率,這時也會產生消息堆積,從而造成輸出緩沖區越來越大,占用過多內存,甚至導致系統崩潰。

所以 Redis 設置了一些保護機制來避免這種情況的出現,這些機制作用于不同種類的客戶端,有不同的輸出緩沖區大小限制,限制方式有兩種:

一種是大小限制,當某一個客戶端的緩沖區超過某一大小時,直接關閉掉這個客戶端連接

另一種是當某一個客戶端的緩沖區持續一段時間占用空間過大時,也直接關閉掉客戶端連接

對于不同客戶端的策略如下:

對普通客戶端來說,限制為 0,也就是不限制,因為普通客戶端通常采用阻塞式的消息應答模式,如:發送請求,等待返回,再發請求,再等待返回。這種模式通常不會導致輸出緩沖區的堆積膨脹。

對于 Pub/Sub 客戶端來說,大小限制是 32m,當輸出緩沖區超過 32m 時,會關閉連接。持續性限制是,當客戶端緩沖區大小持續 60 秒超過 8m,也會導致連接關閉。

而對于 Slave 客戶端來說,大小限制是 256m,持續性限制是當客戶端緩沖區大小持續 60 秒超過 64m 時,關閉連接。

上面三種規則都是可配置的。可以通過 CONFIG SET 命令或者修改 redis.conf 文件來配置。

輸入緩沖區大小限制

Redis 對輸入緩沖區大小的限制比較暴力,當客戶端傳輸的請求大小超過 1G 時,服務端會直接關閉連接。這種方式可以有效防止一些客戶端或服務端 bug 導致的輸入緩沖區過大的問題。

Client 超時

對當前的 Redis 版本來說,服務端默認是不會關閉長期空閑的客戶端的。但是你可以修改默認配置來設置你希望的超時時間。比如客戶端超過多長時間無交互,就直接關閉。同理,這也可以通過 CONFIG SET 命令或者修改 redis.conf 文件來配置。

值得注意的是,超時時間的設置,只對普通客戶端起作用,對 Pub/Sub 客戶端來說,長期空閑狀態是正常的。

另外,實際的超時時間可能不會像設定的那樣精確,這是因為 Redis 并不會采用計時器或者輪訓遍歷的方法來檢測客戶端超時,而是通過一種漸近式的方式來完成,每次檢查一部分。所以導致的結果就是,可能你設置的超時時間是 10s,但是真實執行的時間是超時 12s 后客戶端才被關閉。

CLIENT 命令

Redis 的 CLIENT 命令能夠實現三種功能:檢查連接的狀態,殺掉某個連接以及為連接設置名字。

CLIENT LIST 命令能夠獲取當前所有客戶端的狀態,使用方法如下:

redis 127.0.0.1:6379 client list

addr=127.0.0.1:52555 fd=5 name= age=855 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client

addr=127.0.0.1:52787 fd=6 name= age=6 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping

如上面命令的輸出可知,目前此 Redis 有兩個客戶端連接,每一行表示一個連接的各項信息:

addr: 客戶端的 TCP 地址,包括 IP 和端口

fd: 客戶端連接 socket 對應的文件描述符句柄號

name: 連接的名字,默認為空,可以通過 CLIENT SETNAME 設置

age: 客戶端存活的秒數

idle: 客戶端空閑的秒數

flags: 客戶端的類型 (N 表示普通客戶端,更多類型見 http://redis.io/commands/client-list)

omem: 輸出緩沖區的大小

cmd: 最后執行的命令名稱

你可以查看 CLIENT LIST 的文檔來具體查看所有輸出的含義。

當你通過上面命令獲取到客戶端列表后,就可以通過 CLIENT KILL 命令來殺死指定的連接了。CLIENT KILL 的參數就是上面的 addr 值。

如上面提到的 CLIENT SETNAME 和 CLIENT GETNAME 可以用來為一個連接設置一個名字。

感謝各位的閱讀!關于“Redis 處理客戶端連接的方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向 AI 問一下細節

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-04發表,共計3508字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 迁安市| 德保县| 海城市| 天门市| 合山市| 驻马店市| 抚宁县| 峨山| 金川县| 望谟县| 察雅县| 封丘县| 莲花县| 岱山县| 鲁甸县| 怀安县| 万年县| 安图县| 定南县| 河源市| 张家口市| 麻城市| 三河市| 邵武市| 尉氏县| 通化县| 聂荣县| 徐汇区| 盐山县| 青阳县| 望江县| 龙门县| 民乐县| 永昌县| 涪陵区| 南华县| 长泰县| 三门峡市| 南城县| 景谷| 沙坪坝区|