本章了解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ù):"*"
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
-
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ù))
客戶端的存活狀態(tài):age和idle分別代表客戶端已連接的時間和最近一次空閑時間
客戶端的限制最大連接數(shù)maxclients和超時時間timeout
-
客戶端類型:flag標(biāo)識類型
-
其他
client setName 和 client getName 設(shè)置名字
client kill ip:port 殺掉指定IP地址和端口的客戶端
client pause timeout(毫秒):用于阻塞客戶端叹阔,讓主從保持一致,將客戶端切換到另一個節(jié)點
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. 客戶端常見異常
- 無法從連接池獲取到連接:連接池小,沒有釋放歸還邢隧?存在慢查詢操作修档?或者阻塞了
- 客戶端讀寫超時:讀寫超時閾值短,命令本身慢府框,網(wǎng)絡(luò)問題,Redis自身阻塞
- 客戶端連接超時:timeout設(shè)置短了讥邻,Redis自設(shè)腦阻塞迫靖,網(wǎng)絡(luò)問題
- 客戶端緩沖區(qū)異常:輸出緩沖區(qū)滿了,不正常并發(fā)讀寫
- Lua腳本正在執(zhí)行兴使,超過time-limit
- Redis正在加載持久化文件
- Redis使用內(nèi)存超過maxmemory
- 客戶端連接數(shù)過大
6. 客戶端案例分析
6.1 Redis內(nèi)存陡增
- 查看主從數(shù)據(jù)是否一致
- 是否由于客戶端緩沖區(qū)造成主節(jié)點內(nèi)存陡增系宜,info clients
發(fā)現(xiàn)有客戶端執(zhí)行monitor命令
處理方法:
- 運維層面禁止monitor
- 限制輸出緩沖區(qū)大小
- 使用專業(yè)Redis運維工具,快速發(fā)現(xiàn)定位問題
6.2 客戶端周期性超時
慢查詢導(dǎo)致超時发魄。
要避免不正確的使用方式盹牧。