Redis:21---客戶端相關配置篇

一、客戶端相關配置

①客戶端的限制maxclients

  • Redis提供了maxclients參數來限制最大客戶端連接數,一旦連接數超過 maxclients,新的連接將被拒絕

  • maxclients默認值是10000

  • 可以通過info clients來查詢當前Redis的連接數:

  • 可以通過config set maxclients對最大客戶端連接數進行動態設置:

  • 但是這個參數會受到操作系統設置的限制,在后面“Redis實踐篇的陷阱文章中還會介紹”

②客戶端的限制timeout

  • 一般來說maxclients=10000在大部分場景下已經絕對夠用,但是某些情況由于業務方使用不當(例如沒有主動關閉連接)可能存在大量idle連接, 無論是從網絡連接的成本還是超過maxclients的后果來說都不是什么好事,?因此Redis提供了timeout(單位為秒)參數來限制連接的最大空閑時間,一 旦客戶端連接的idle時間超過了timeout,連接將會被關閉

  • timeout默認為0,也就是不會檢測客戶端的空閑

  • 該參數也可以動態設置。例如設置timeout為30秒:

演示案例

  • 下面繼續使用Jedis進行模擬,整個代碼和上面是一樣的,只不過第2) 步驟休息了31秒:

String key = "hello";
// 1) 生成jedis,并執行get操作
Jedis jedis = new Jedis("127.0.0.1", 6379);
System.out.println(jedis.get(key));
// 2) 休息31秒
TimeUnit.SECONDS.sleep(31);
// 3) 執行get操作
System.out.println(jedis.get(key));
// 4) 休息5秒
TimeUnit.SECONDS.sleep(5);
// 5) 關閉jedis連接
jedis.close();
  • 執行上述代碼可以發現在執行完第2)步之后,client list中已經沒有了 Jedis的連接,也就是說timeout已經生效,將超過30秒空閑的連接關閉掉:

  • 同時可以看到,在Jedis代碼中的第3)步拋出了異常,因為此時客戶端 已經被關閉,所以拋出的異常是JedisConnectionException,并且提示 Unexpected end of stream:

  • 如果將Redis的loglevel設置成debug級別,可以看到如下日志,也就是客 戶端被Redis關閉的日志:

  • Redis源碼中redis.c文件中clientsCronHandleTimeout函數就是針對timeout 參數進行檢驗的,只不過在源碼中timeout被賦值給了server.maxidletime:

int?clientsCronHandleTimeout(redisClient?*c)?{//?當前時間time_t?now?=?server.unixtime;//?server.maxidletime就是參數timeoutif?(server.maxidletime?&&//?很多客戶端驗證,這里就不占用篇幅,最重要的驗證是下面空閑時間超過了maxidletime就會//?被關閉掉客戶端(now?-?c->lastinteraction?>?server.maxidletime)){redisLog(REDIS_VERBOSE,"Closing?idle?client");//?關閉客戶端freeClient(c);}}
  • Redis的默認配置給出的timeout=0,在這種情況下客戶端基本不會出現上面的異常,這是基于對客戶端開發的一種保護。例如很多開發人員在使用JedisPool時不會對連接池對象做空閑檢測和驗證,如果設置了timeout>0,可 能就會出現上面的異常,對應用業務造成一定影響,但是如果Redis的客戶 端使用不當或者客戶端本身的一些問題,造成沒有及時釋放客戶端連接,可能會造成大量的idle連接占據著很多連接資源,一旦超過maxclients;后果也是不堪設想。所在在實際開發和運維中,需要將timeout設置成大于0,例如 可以設置為300秒,同時在客戶端使用上添加空閑檢測和驗證等等措施,例如JedisPool使用common-pool提供的三個屬性:minEvictableIdleTimeMillis、 testWhileIdle、timeBetweenEvictionRunsMillis

③tcp-keepalive

  • 檢測TCP連接活性的周期

  • 默認值為300

  • 如果需要設置,建議為60,那么Redis會每隔60秒對它創建的TCP連接進行活性檢測,防止大量死連接占用系統資源

④tcp-backlog

  • TCP三次握手后,會將接受的連接放入隊列中,tcpbacklog就是隊列的大小

  • 它在Redis中的默認值是511

  • 修改方法也非常簡單,只需要執行如下命令

echo 511 > /proc/sys/net/core/somaxconn
  • 通常來講這個參數不需要調整,但是這個參數會受到操作系統的影響。例如在Linux操作系統 中,如果/proc/sys/net/core/somaxconn小于tcp-backlog,那么在Redis啟動時會 看到如下日志,并建議將/proc/sys/net/core/somaxconn設置更大

二、客戶端統計片段

info clients

  • 例如下面就是一次info clients的執行結果:

?

  • 說明如下:

    • connected_clients:代表當前Redis節點的客戶端連接數,需要重點監控,一旦超過maxclients,新的客戶端連接將被拒絕

    • client_recent_max_output_buffer:當前所有輸出緩沖區中隊列對象個數的最大值

    • client_recent_max_input_buffer:當前所有輸入緩沖區中占用的最大容量

    • blocked_clients:正在執行阻塞命令(例如blpop、brpop、 brpoplpush)的客戶端個數

info stats

  • 參數說明:

    • total_connections_received:Redis自啟動以來處理的客戶端連接數總數

    • rejected_connections:Redis自啟動以來拒絕的客戶端連接數,需要重點監控

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444305.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444305.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444305.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis:23---info命令總結

info命令的格式有3種:info:部分Redis系統狀態統計信息info all:全部Redis系統狀態統計信息,一次性打印下面所有p的內容info p:某一塊的系統狀態統計信息。info命令所有的p如下所示模塊名模塊含義 Server服務器信息Clie…

Redis:22---客戶端API:client、monitor)

一、client listclient list命令能列出與Redis服務端相連的所有客戶端連接信息。例如下面代碼是在一個Redis實例上執行client list的結果,其中每一行代表一個客戶端信息:下面將選擇幾個重要的屬性進行說明,其余通過表格的形式進行展示①標識&…

leetcode175. 組合兩個表(SQL)

表1: Person ---------------------- | 列名 | 類型 | ---------------------- | PersonId | int | | FirstName | varchar | | LastName | varchar | ---------------------- PersonId 是上表主鍵 表2: Address ---------------------- | 列名 …

Redis:20---常用功能之(發布與訂閱)

一、發布與訂閱概述Redis提供了基于“發布/訂閱”模式的消息機制,此種模式下,消息發布者和訂閱者不進行直接通信,發布者客戶端向指定的頻道(channel)發布消息,訂閱該頻道的每個客戶端都可以收到該消息。 下…

Redis:19---常用功能之(HyperLogLog)

一、HyperLogLog概述HyperLogLog并不是一種新的數據結構(實際類型為字符串類型),而是一種基數算法,通過HyperLogLog可以利用極小的內存空間完成獨立總數的統計,數據集可以是IP、Email、ID等HyperLogLog提供了3個命令&a…

計算時間差的Oracle函數

Oracle函數可以實現諸多的功能,下面就介紹使用Oracle函數計算時間差的實現方法,如果您對Oracle函數方面感興趣的話,不妨一看。 兩個Date類型字段:START_DATE,END_DATE,計算這兩個日期的時間差(分…

leetcode181. 超過經理收入的員工(SQL)

Employee 表包含所有員工,他們的經理也屬于員工。每個員工都有一個 Id,此外還有一列對應員工的經理的 Id。 ------------------------------ | Id | Name | Salary | ManagerId | ------------------------------ | 1 | Joe | 70000 | 3 |…

UNIX(多線程):01---線程簡介及線程限制

一、線程的概念 典型的UNIX進程可以看成只有一個控制線程:一個進程在同一時刻只做一件事。有了多個控制線程后,在程序設計時可以把進程設計成在同一時刻能夠做不止一件事,每個線程處理各自獨立的任務二、線程的優點 通過為每種事件類型分配單獨的處理線程,可以簡化處理異步…

UNIX(多線程):13---condition_variable、wait、notify_one、notify_all

條件變量std::condition_variable、wait()、notify_one() 線程A: 等待一個條件滿足線程B: 專門往消息隊列中放入消息(數據),達到一定條件,通知處于等待中的線程A。std::condition_variable實際上是一個類,是一個和條件相關的一個類,說白了就是等待一個條件達成。這個類是…

leetcode176. 第二高的薪水(SQL)

編寫一個 SQL 查詢,獲取 Employee 表中第二高的薪水(Salary) 。 ------------ | Id | Salary | ------------ | 1 | 100 | | 2 | 200 | | 3 | 300 | ------------ 例如上述 Employee 表,SQL查詢應該返回 200 作為第二…

UNIX(多線程):17---異步任務提供者(Provider) 介紹

std::promise 類概述 Promise 對象可以保存某一類型 T 的值,該值可被 future 對象讀取(可能在另外一個線程中),因此 promise 也提供了一種線程同步的手段。在 promise 對象構造時可以和一個共享狀態(通常是std::future)相關聯,并可以在相關聯的共享狀態(std::future)上保…

leetcode180. 連續出現的數字(SQL)

編寫一個 SQL 查詢,查找所有至少連續出現三次的數字。 --------- | Id | Num | --------- | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 1 | | 6 | 2 | | 7 | 2 | --------- 例如,給定上面的 Logs 表, 1 是唯一連續…

UNIX(多線程):18---異步任務提供者(Provider) 介紹(續)

本文主要介紹 std::packaged_task。 std::packaged_task 包裝一個可調用的對象,并且允許異步獲取該可調用對象產生的結果,從包裝可調用對象意義上來講,std::packaged_task 與 std::function 類似,只不過 std::packaged_task 將其包裝的可調用對象的執行結果傳遞給一個 std:…

leetcode182. 查找重復的電子郵箱(SQL)

編寫一個 SQL 查詢,查找 Person 表中所有重復的電子郵箱。 示例: ------------- | Id | Email | ------------- | 1 | ab.com | | 2 | cd.com | | 3 | ab.com | ------------- 根據以上輸入,你的查詢應返回以下結果: ----…

UNIX(多線程):19---Future 類型詳解

Future 類型詳解 本文主要介紹 std::future,std::shared_future 以及 std::future_error,另外還會介紹 <future> 頭文件中的 std::async,std::future_category 函數以及相關枚舉類型。 std::future 詳解 std::future 概述 前面已經多次提到過 std::future,那么 std::…

UNIX(多線程):20---生產者消費者實例

本文將綜合運用 C++11 中的新的基礎設施(主要是多線程、鎖、條件變量)來闡述一個經典問題——生產者消費者模型,并給出完整的解決方案。 生產者消費者問題是多線程并發中一個非常經典的問題,相信學過操作系統課程的同學都清楚這個問題的根源。本文將就四種情況分析并介紹生產…

leetcode183. 從不訂購的客戶(SQL)

某網站包含兩個表&#xff0c;Customers 表和 Orders 表。編寫一個 SQL 查詢&#xff0c;找出所有從不訂購任何東西的客戶。 Customers 表&#xff1a; ----------- | Id | Name | ----------- | 1 | Joe | | 2 | Henry | | 3 | Sam | | 4 | Max | ----------- Or…

UNIX(多線程):21---線程池實現原理

線程池簡介: 線程過多會帶來調度開銷,進而影響緩存局部性和整體性能。 而線程池維護著多個線程,等待著監督管理者分配可并發執行的任務。這避免了在處理短時間任務時創建與銷毀線程的代價。線程池不僅能夠保證內核的充分利用,還能防止過分調度。可用線程數量應該取決于可用…

leetcode197. 上升的溫度(SQL)

給定一個 Weather 表&#xff0c;編寫一個 SQL 查詢&#xff0c;來查找與之前&#xff08;昨天的&#xff09;日期相比溫度更高的所有日期的 Id。 --------------------------------------------- | Id(INT) | RecordDate(DATE) | Temperature(INT) | -----------------------…

UNIX(多線程):22---幾種常見的線程池

常見線程池 1、newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。 從構造方法來看,它可以單獨執行,也可以與周期線程池結合用。其任務隊列是LinkedBlockingQueue,這是個無界的阻塞…