您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“redis中如何使用pipeline”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“redis中如何使用pipeline”這篇文章吧。
redis是一個cs模式的tcp server,使用和http類似的請求響應協議。一個client可以通過一個socket連接發起多個請求命令。每個請求命令發出后client通常 會阻塞并等待redis服務處理,redis處理完后請求命令后會將結果通過響應報文返回給client。基本的通信過程如下
Client: INCR X
Server: 1
Client: INCR X
Server: 2
Client: INCR X
Server: 3
Client: INCR X
Server: 4
基 本上四個命令需要8個tcp報文才能完成。由于通信會有網絡延遲,假如從client和server之間的包傳輸時間需要0.125秒。那么上面的四個命 令8個報文至少會需要1秒才能完成。這樣即使redis每秒能處理100個命令,而我們的client也只能一秒鐘發出四個命令。這顯示沒有充分利用 redis的處理能力。除了可以利用mget,mset 之類的單條命令處理多個key的命令外
我們還可以利用pipeline的方式從client打包多條命令一起發出,不需要等待單條命令的響應返回,而redis服務端會處理完多條命令后會將多條命令的處理結果打包到一起返回給客戶端。通信過程如下
Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4
假 設不會因為tcp 報文過長而被拆分。可能兩個tcp報文就能完成四條命令,client可以將四個incr命令放到一個tcp報文一起發送,server則可以將四條命令 的處理結果放到一個tcp報文返回。通過pipeline方式當有大批量的操作時候。我們可以節省很多原來浪費在網絡延遲的時間。需要注意到是用 pipeline方式打包命令發送,redis必須在處理完所有命令前先緩存起所有命令的處理結果。打包的命令越多,緩存消耗內存也越多。所以并是不是打 包的命令越多越好。具體多少合適需要根據具體情況測試。下面是個jredis客戶端使用pipeline的測試
package jredisStudy;
import org.jredis.JRedis;
import org.jredis.connector.ConnectionSpec;
import org.jredis.ri.alphazero.JRedisClient;
import org.jredis.ri.alphazero.JRedisPipelineService;
import org.jredis.ri.alphazero.connection.DefaultConnectionSpec;
public class PipeLineTest {
public static void main(String[] args) {
long start =System.currentTimeMillis();
usePipeline();
long end =System.currentTimeMillis();
System.out.println(end-start);
start = System.currentTimeMillis();
withoutPipeline();
end =System.currentTimeMillis();
System.out.println(end-start);
}
private static void withoutPipeline()
{
try {
JRedis jredis = new JRedisClient("192.168.56.55",6379);
for(int i =0 ; i < 100000 ; i++)
{
jredis.incr("test2");
}
jredis.quit();
} catch (Exception e) {
}
}
private static void usePipeline() {
try {
ConnectionSpec spec =DefaultConnectionSpec.newSpec("192.168.56.55", 6379, 0, null);
JRedis jredis = newJRedisPipelineService(spec);
for(int i =0 ; i <100000 ; i++)
{
jredis.incr("test2");
}
jredis.quit();
} catch (Exception e) {
}
}
}
輸出
103408 //使用了pipeline
104598 //沒有使用
測試結果不是很明顯,這應該是跟我的測試環境有關。我是在自己win連接虛擬機的linux。網絡延遲比較小。所以pipeline
優勢不明顯。如果網絡延遲小的話,最好還是不用pipeline。除了增加復雜外,帶來的性能提升不明顯。
以上是“redis中如何使用pipeline”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。