共計 2282 個字符,預計需要花費 6 分鐘才能閱讀完成。
這篇文章主要為大家展示了“redis 中如何使用 pipeline”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓丸趣 TV 小編帶領大家一起研究并學習一下“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”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!