第4章 客戶端

本章了解Redis服務(wù)端和客戶端的通信協(xié)議慨畸,以及主流編程語言的Redis客戶端使用方法莱坎。

1. 客戶端通信協(xié)議

  • 基于TCP協(xié)議
  • 制定了RESP(Redis序列化協(xié)議)實現(xiàn)交互

發(fā)送命令格式

CRLF 代表"\r\n"

*<參數(shù)數(shù)量> CRLF 
$<參數(shù)1的字節(jié)數(shù)量>CRLF
<參數(shù)1>CRLF
...
$<參數(shù)N的字節(jié)速率>CRLF
<參數(shù)N>CRLF

比如set hello world命令,傳輸格式為:

*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n

返回結(jié)果格式

  • 狀態(tài)回復(fù):在RESP中第一個字節(jié)為 "+"
  • 錯誤回復(fù):"-"
  • 整數(shù)回復(fù):":"
  • 字符串回復(fù):"$"
  • 多條字符串回復(fù):"*"
Redis在RESP下的編碼.jpg

2. Java客戶端Jedis

3. Python客戶端redis-py

3.1 獲取redis-py

pip install redis

3.2 redis-py的基本使用方法

import redis
client = redis.StrictRedis(host='127.0.0.1', port = 3679)
key = "hello"
setResult = client.set(key, "python-redis")
value = client.get(key)

3.3 redis-py中的Pipeline的使用方法

pipeline = clinet.pipeline(transcation=Flase)  //不使用事務(wù)
//生成pipeline
pipeline.set("hello", "world")
pipeline.incr("counter")
//執(zhí)行pipeline
result = pipeline.execute()

3.4 redis-py中的Lua腳本使用方法

eval(String script, int KeyCount, String ... params)
//script:Lua腳本內(nèi)容寸士,keyCount:鍵的個數(shù)檐什,params:相關(guān)參數(shù)
script_load(String script)
evalsha(String sha1, int keyCount, String ... params)

以簡單的Lua腳本為例

script = "return redis.call('get',KEYS[1])"
client.eval(script, 1, "hello")

scriptSha = client.script_load(script)
client.evalsha(scriptSha, 1, "hello")

4. 客戶端管理

在服務(wù)端可以查看客戶端狀態(tài)

4.1 客戶端API

  1. client list

    • 標(biāo)識: id、addr弱卡、fd乃正、name

    • 輸入緩沖區(qū):qbuf、qbuf-free婶博,將客戶端發(fā)送的命令臨時保存瓮具,注意容量(動態(tài)分配)不能超過1G,也要注意有可能超過maxmemory

    • 輸出緩沖區(qū):obl(固定緩沖區(qū)長度),oll(動態(tài)緩沖區(qū)長度)名党,omem(使用的字節(jié)數(shù))


      客戶端輸出緩沖模型.jpg

      固定緩沖區(qū)和動態(tài)緩沖區(qū).jpg
    • 客戶端的存活狀態(tài):age和idle分別代表客戶端已連接的時間和最近一次空閑時間

    • 客戶端的限制最大連接數(shù)maxclients和超時時間timeout

    • 客戶端類型:flag標(biāo)識類型


      客戶端類型.jpg
    • 其他


      client list命令結(jié)果全部屬性.jpg
  2. client setName 和 client getName 設(shè)置名字

  3. client kill ip:port 殺掉指定IP地址和端口的客戶端

  4. client pause timeout(毫秒):用于阻塞客戶端叹阔,讓主從保持一致,將客戶端切換到另一個節(jié)點

  5. monitor:監(jiān)控Redis正在執(zhí)行的命令传睹,能監(jiān)聽其他客戶端執(zhí)行的命令耳幢,但是會占用大量內(nèi)存

4.2 客戶端相關(guān)配置

  • timeout
  • maxclients
  • tcp-keepalive:檢測TCP連接活性的周期
  • tcp-backlog:TCP三次握手后,將接受的連接放入隊列欧啤,tcp-backlog就是隊列的大小

4.3 客戶端統(tǒng)計片段

127.0.0.1:6379> info clients
#Clients
connected_clients:1414      //當(dāng)前客戶端數(shù)量睛藻,超過maxclients會被拒絕
client_longest_output_list:0    //當(dāng)前所有輸出緩沖區(qū)中隊列對象個數(shù)的最大值
client_biggest_input_bur:2097152  //當(dāng)前所有輸入緩沖區(qū)中占用的最大容量
blocked_client:0    //正在執(zhí)行阻塞命令的客戶端個數(shù)

5. 客戶端常見異常

  1. 無法從連接池獲取到連接:連接池小,沒有釋放歸還邢隧?存在慢查詢操作修档?或者阻塞了
  2. 客戶端讀寫超時:讀寫超時閾值短,命令本身慢府框,網(wǎng)絡(luò)問題,Redis自身阻塞
  3. 客戶端連接超時:timeout設(shè)置短了讥邻,Redis自設(shè)腦阻塞迫靖,網(wǎng)絡(luò)問題
  4. 客戶端緩沖區(qū)異常:輸出緩沖區(qū)滿了,不正常并發(fā)讀寫
  5. Lua腳本正在執(zhí)行兴使,超過time-limit
  6. Redis正在加載持久化文件
  7. Redis使用內(nèi)存超過maxmemory
  8. 客戶端連接數(shù)過大

6. 客戶端案例分析

6.1 Redis內(nèi)存陡增

Redis主從節(jié)點內(nèi)存不一致.jpg
  1. 查看主從數(shù)據(jù)是否一致
  2. 是否由于客戶端緩沖區(qū)造成主節(jié)點內(nèi)存陡增系宜,info clients

發(fā)現(xiàn)有客戶端執(zhí)行monitor命令

處理方法:

  1. 運維層面禁止monitor
  2. 限制輸出緩沖區(qū)大小
  3. 使用專業(yè)Redis運維工具,快速發(fā)現(xiàn)定位問題

6.2 客戶端周期性超時

客戶端耗時統(tǒng)計.jpg

慢查詢導(dǎo)致超時发魄。
要避免不正確的使用方式盹牧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市励幼,隨后出現(xiàn)的幾起案子汰寓,更是在濱河造成了極大的恐慌,老刑警劉巖苹粟,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件有滑,死亡現(xiàn)場離奇詭異,居然都是意外死亡嵌削,警方通過查閱死者的電腦和手機毛好,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苛秕,“玉大人肌访,你說我怎么就攤上這事⊥Ы伲” “怎么了吼驶?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我旨剥,道長咧欣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任轨帜,我火速辦了婚禮魄咕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚌父。我一直安慰自己哮兰,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布苟弛。 她就那樣靜靜地躺著喝滞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膏秫。 梳的紋絲不亂的頭發(fā)上右遭,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音缤削,去河邊找鬼窘哈。 笑死,一個胖子當(dāng)著我的面吹牛亭敢,可吹牛的內(nèi)容都是我干的滚婉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼帅刀,長吁一口氣:“原來是場噩夢啊……” “哼让腹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起扣溺,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤骇窍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后娇妓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體像鸡,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年哈恰,在試婚紗的時候發(fā)現(xiàn)自己被綠了只估。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡着绷,死狀恐怖蛔钙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荠医,我是刑警寧澤吁脱,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布桑涎,位于F島的核電站,受9級特大地震影響兼贡,放射性物質(zhì)發(fā)生泄漏攻冷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一遍希、第九天 我趴在偏房一處隱蔽的房頂上張望等曼。 院中可真熱鬧,春花似錦凿蒜、人聲如沸禁谦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽州泊。三九已至,卻和暖如春漂洋,著一層夾襖步出監(jiān)牢的瞬間遥皂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工刽漂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留渴肉,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓爽冕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親披蕉。 傳聞我的和親對象是個殘疾皇子颈畸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 01 我是一個性子急且容易暴躁的人眯娱。 怎么解釋這個性子急且容易暴躁呢?從小時候說起吧爬凑。 在我記憶中徙缴,能夠記得自己的...
    北漂女孩閱讀 293評論 1 0
  • 男人多半不想你問,你和前任女友誰美嘁信,他最愛誰的問題于样。 我們經(jīng)常向別人取經(jīng),如何維系好兩性關(guān)系潘靖。 實際上呢穿剖,不管兩性...
    花鎮(zhèn)閱讀 448評論 0 0
  • 一個叫凱的男人瞎了 文/ 木棉 1 我,名叫凱卦溢,今年28歲糊余,處于一個人最好的年紀(jì)秀又。 一年前,我在投行上班贬芥,那時剛升...
    一株木棉花閱讀 322評論 9 4
  • 有句古話說:活到老吐辙,學(xué)到老。現(xiàn)在的自己縱然是抱著這個態(tài)度蘸劈,卻未有資格說這句話昏苏。 今天去拜訪一位友人,一起喝茶聊著昵时。...
    張梓荷閱讀 255評論 0 0
  • 在一個富麗堂皇但昏暗的寢殿中捷雕,紅衣長袍的妖艷男子喝著酒,看著歌舞壹甥,并肆意施法殺戮著舞姬救巷,他衣袖一揮,舞姬三五成群身...
    咖啡解藥閱讀 282評論 0 1