歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Redis測試分析(pipeline模式推薦)

Redis測試分析(pipeline模式推薦)

日期:2017/2/28 15:57:49   编辑:Linux教程
測試環境
Redis測試版本:2.2.12
使用Java Jedis客戶端進行測試
測試數據量:50萬, 超過2億

速度
1) mset函數插入效率最高,插入Redis的速度達到20萬條數據/秒。但是該函數所耗內存較高,對於我們實際應用一表每天2.4億的數據量來說,需要消耗近32G內存;
2) mset函數中當m值達到200以上時,插入速度接近飽和,因此實際應用中,應設定該值 >= 200,以達到最高的插入效率;
3) set函數除非特定應用場景需求,否則應盡量不要使用,其插入效率為mset函數的1/20;
4) 盡管不同的函數都有string與byte[]兩種不同的形式,但是對於Redis來說byte[]的形式也是將每個byte看成是一個字符來進行處理的。在實際應用中,對於較長的整型數據(例如:9824224123),可以將其轉換為byte[]的形式,4個byte[]可以存儲一個int數據,這樣會比采用string的形式存儲節省一部分的內存開銷;
5) hset函數插入效率與set函數相當;
6) hmset由於在實際應用中,每條數據對應的key不相同,需要維護一個本機的緩存容器Map<key,Map<field, value>>,因此插入速度要比mset函數慢一些;

內存
1) hset和 hmset函數大約可以比set和mset函數節省三分之一的內存;
2) hset和hmset函數對於每個key所存儲的<field, value>數目非常敏感。一旦超過限制,插入效率下降十分明顯,同樣,內存開銷也會顯著增加。在實際應用中,應盡量保證每個key下面的<field, value>的數目不超過限制(默認值為64)。

Pipeline
redis的pipeline(管道)功能在命令行中沒有,但redis是支持pipeline的,而且在各個語言版的client中都有相應的實現。
Redis本身是一個cs模式的tcp server, client可以通過一個socket連續發起多個請求命令。 每個請求命令發出後client通常會阻塞並等待redis服務端處理,redis服務端處理完後將結果返回給client。
Java代碼
  1. Client: hset a1 field value
  2. Server: 1
  3. Client: hset a2 field value
  4. Server: 1
  5. Client: hset a3 field value
  6. Server: 1
  7. Client: hset a4 field value
  8. Server: 1
這種發送模式中由於網絡開銷延遲,即算redis server端有很強的處理能力,也由於收到的client消息少,而造成吞吐量小。我們可以修改一種處理模式,
Java代碼
  1. Client: hset a1 field value
  2. Client: hset a2 field value
  3. Client: hset a3 field value
  4. Client: hset a4 field value
  5. Server: 1
  6. Server: 1
  7. Server: 1
  8. Server: 1
通過pipeline方式將client端命令一起發出,redis server會處理完多條命令後,將結果一起打包返回client,從而節省大量的網絡延遲開銷。
下面以Java的客戶端jedis來測試pipeline的效果。
Java代碼
  1. Pipeline pipeline = jedis.pipelined();
  2. long start = System.currentTimeMillis();
  3. for (int i = 0; i < 10000; i++) {
  4. pipeline.hset("server", "" + i, "" + i);
  5. }
  6. List<Object> results = pipeline.execute();
  7. long end = System.currentTimeMillis();
  8. System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds");
測試的結果采用pipeline方式,效率幾乎與mset一樣,每秒插入約15萬數據,但內存占用僅為mset的1/3.
Copyright © Linux教程網 All Rights Reserved