redis 性能測(cè)試是通過(guò)同時(shí)執(zhí)行多個(gè)命令實(shí)現(xiàn)的。
1,Redis-benchmark
Redis性能命令:
redis性能命令格式:
redis-benchmark [option] [option value]
redis 性能測(cè)試工具可選參數(shù)如下所示:
序號(hào) 選項(xiàng) 描述 默認(rèn)值
1 -h 指定服務(wù)器主機(jī)名 127.0.0.1
2 -p 指定服務(wù)器端口 6379
3 -s 指定服務(wù)器 socket
4 -c 指定并發(fā)連接數(shù) 50
5 -n 指定請(qǐng)求數(shù) 10000
6 -d 以字節(jié)的形式指定 SET/GET 值的數(shù)據(jù)大小 2
7 -k 1=keep alive 0=reconnect 1
8 -r SET/GET/INCR 使用隨機(jī) key, SADD 使用隨機(jī)值
9 -P 通過(guò)管道傳輸 <numreq> 請(qǐng)求 1
10 -q 強(qiáng)制退出 redis。僅顯示 query/sec 值
11 --csv 以 CSV 格式輸出
12 -l 生成循環(huán),永久執(zhí)行測(cè)試
13 -t 僅運(yùn)行以逗號(hào)分隔的測(cè)試命令列表。
14 -I Idle 模式。僅打開(kāi) N 個(gè) idle 連接并等待。
測(cè)試redis性能
redis-benchmark -h {host} -p {port} -c {concurrency} -n {requests}
測(cè)試指定字節(jié)的數(shù)據(jù)包的性能
redis-benchmark -h {host} -p {port} -q -d {bytes}
測(cè)試某些命令性能
redis-benchmark -t {command1,command2} -n {requests} -q
測(cè)試某些數(shù)值存取的性能
redis-benchmark -n {requests} -q script load "redis.call('set','foo','bar')"
例如:
代表100各個(gè)客戶端同時(shí)請(qǐng)求Redis,一共執(zhí)行20000次
redis-benchmark -c 100 -n 20000
====== MSET (10 keys) ======
20000 requests completed in 0.57 seconds
100 parallel clients
3 bytes payload
keep alive: 1
0.07% <= 1 milliseconds
0.33% <= 2 milliseconds
89.11% <= 3 milliseconds
97.31% <= 4 milliseconds
99.32% <= 5 milliseconds
99.92% <= 6 milliseconds
99.98% <= 7 milliseconds
100.00% <= 7 milliseconds
35335.69 requests per second
2、Pipelining
- Redis是是一種client-server的request/response的模式,Redis有單獨(dú)的TCP Server。
- client發(fā)送請(qǐng)求請(qǐng)求到server端,然后需要阻塞等待server端的響應(yīng)
- server端處理請(qǐng)求然后返回響應(yīng)給client
即如上中介紹的HTTP的request/response一樣。在這種模式中,數(shù)據(jù)包必須從client發(fā)送到server端,然后再?gòu)膕erver端返回到client端,這個(gè)時(shí)間叫做RTT(Round Trip Time)。
假設(shè)Redis Server每秒能處理100k請(qǐng)求,但是RTT是250ms,這樣Redis Server實(shí)際每秒只能處理4個(gè)請(qǐng)求,而且這種影響會(huì)隨著網(wǎng)絡(luò)延遲越大而逐漸加劇。所帶來(lái)的直接影響:
- 阻塞客戶端線程或進(jìn)程,消耗資源,大量請(qǐng)求時(shí)無(wú)疑降低client性能
- 降低server端的吞吐量
為了解決該問(wèn)題,需要一種client無(wú)等待響應(yīng)的方式發(fā)送請(qǐng)求至server的模式,即Redis pipelining。
Redis pipelining降低了高延遲網(wǎng)絡(luò)中,request/response方式帶來(lái)的請(qǐng)求應(yīng)答的環(huán)回時(shí)間消耗:
- 無(wú)序等待響應(yīng)的方式發(fā)送請(qǐng)求,減少等待時(shí)間(特別在高延遲網(wǎng)絡(luò)中)
- 一次性返回響應(yīng),減少多次響應(yīng)的帶來(lái)的時(shí)間消耗
更重要的一點(diǎn)是,在request/response的方式中,逐次發(fā)送請(qǐng)求至server端,server端每次都需要read/write,這里的read/write是systcall,涉及到內(nèi)核態(tài)和用戶態(tài)的切換,非常消耗系統(tǒng)資源。Redispipelining的方式盡量減少了這種系統(tǒng)狀態(tài)的切換開(kāi)銷(xiāo)。
redis-benchmark -n 1000000 -t set,get -P 16 -q