1.redis-server
除了啟動(dòng)Redis外,還有一個(gè)--test-memory選項(xiàng)运杭。redis-server-test-memory可以用來(lái)檢測(cè)當(dāng)前操作系統(tǒng)能否穩(wěn)定地分配指定容量的內(nèi)存給 Redis夫啊,通過(guò)這種檢測(cè)可以有效避免因?yàn)閮?nèi)存問(wèn)題造成Redis崩潰
2.redis-benchmark
redis-benchmark可以為Redis做基準(zhǔn)性能測(cè)試,它提供了很多選項(xiàng)幫助開(kāi) 發(fā)和運(yùn)維人員測(cè)試Redis的相關(guān)性能辆憔,下面分別介紹這些選項(xiàng)撇眯。
1.-c
-c(clients)選項(xiàng)代表客戶端的并發(fā)數(shù)量(默認(rèn)是50)。
2.-n<requests>
-n(num)選項(xiàng)代表客戶端請(qǐng)求總量(默認(rèn)是100000)虱咧。
例如redis-benchmark-c100-n20000代表100各個(gè)客戶端同時(shí)請(qǐng)求Redis熊榛,一 共執(zhí)行20000次利赋。redis-benchmark會(huì)對(duì)各類數(shù)據(jù)結(jié)構(gòu)的命令進(jìn)行測(cè)試褂微,并給出性能指標(biāo):
例如上面一共執(zhí)行了20000次get操作造虎,在0.27秒完成排霉,每個(gè)請(qǐng)求數(shù)據(jù)量 是3個(gè)字節(jié)刻两,99.11%的命令執(zhí)行時(shí)間小于1毫秒,Redis每秒可以處理 73529.41次get請(qǐng)求
3.-q
-q選項(xiàng)僅僅顯示redis-benchmark的requests per second信息掺炭,例如:
$redis-benchmark -c 100 -n 20000 -q
4.-r
在一個(gè)空的Redis上執(zhí)行了redis-benchmark會(huì)發(fā)現(xiàn)只有3個(gè)鍵:
5.-P
-P選項(xiàng)代表每個(gè)請(qǐng)求pipeline的數(shù)據(jù)量(默認(rèn)為1)矫限。
6.-k<boolean>
-k選項(xiàng)代表客戶端是否使用keepalive,1為使用转质,0為不使用园欣,默認(rèn)值為1
7.-t
-t選項(xiàng)可以對(duì)指定命令進(jìn)行基準(zhǔn)測(cè)試。
redis-benchmark -t get,set -q?
SET: 98619.32 requests per second?
GET: 97560.98 requests per second
8.--csv
--csv選項(xiàng)會(huì)將結(jié)果按照csv格式輸出休蟹,便于后續(xù)處理沸枯,如導(dǎo)出到Excel等
redis-benchmark -t get,set --csv?
"SET","81300.81"?
"GET","79051.38"
3.1 Pipeline概念
Redis客戶端執(zhí)行一條命令分為如下四個(gè)過(guò)程:
1)發(fā)送命令
2)命令排隊(duì)
3)命令執(zhí)行
4)返回結(jié)果
其中1)+4)稱為Round Trip Time(RTT,往返時(shí)間)赂弓。
Redis提供了批量操作命令(例如mget绑榴、mset等),有效地節(jié)約RTT盈魁。但 大部分命令是不支持批量操作的翔怎,例如要執(zhí)行n次hgetall命令,并沒(méi)有 mhgetall命令存在杨耙,需要消耗n次RTT
例如客戶端在北京赤套,Redis服務(wù)端在上海,兩地直線距離約為 1300公里珊膜,那么1次RTT時(shí)間=1300×2/(300000×2/3)=13毫秒(光在真空中 傳輸速度為每秒30萬(wàn)公里容握,這里假設(shè)光纖為光速的2/3),那么客戶端在1秒 內(nèi)大約只能執(zhí)行80次左右的命令车柠,這個(gè)和Redis的高并發(fā)高吞吐特性背道而馳剔氏。
Pipeline(流水線)機(jī)制能改善上面這類問(wèn)題,它能將一組Redis命令進(jìn) 行組裝堪遂,通過(guò)一次RTT傳輸給Redis介蛉,再將這組Redis命令的執(zhí)行結(jié)果按順序返回給客戶端
redis-cli的--pipe選項(xiàng)實(shí)際上就是使用Pipeline機(jī)制,例如下面操作將set hello world和incr counter兩條命令組裝:
echo -en '*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n*2\r\n$4\r\nincr\r\ n$7\r\ncounter\r\n' | redis-cli --pipe
3.2 最佳實(shí)踐
Pipeline雖然好用溶褪,但是每次Pipeline組裝的命令個(gè)數(shù)不能沒(méi)有節(jié)制币旧,否 則一次組裝Pipeline數(shù)據(jù)量過(guò)大,一方面會(huì)增加客戶端的等待時(shí)間猿妈,另一方 面會(huì)造成一定的網(wǎng)絡(luò)阻塞吹菱,可以將一次包含大量命令的Pipeline拆分成多次 較小的Pipeline來(lái)完成。
Pipeline只能操作一個(gè)Redis實(shí)例彭则,但是即使在分布式Redis場(chǎng)景中鳍刷,也可 以作為批量操作的重要優(yōu)化手段