Java實現Redis pipeline比較


開始實驗這個,是因為Redis實戰.pdf上面有例子。

上面用的是 org.jredis包,可是發現這個包不在maven的公共倉庫里。需要先下載然后放在本地,導入maven依賴。詳見:

http://blog.csdn.net/zhu_tianwei/article/details/44900955

https://github.com/alphazero/jredis

在Redis實戰.pdf上也有例子。

 

而Maven公共倉庫提供的是jedis包。網上也有例子:

http://www.tuicool.com/articles/aeuAfaN

就用這個包來實驗吧。

代碼如下,注意,加了auth的密碼驗證:

package com.myapp.redisdemo;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;


/**
 * Created by baidu on 16/10/16.
 */
public class RedisDemo {

    public static void main(String[] args) {
        String redisIP = "10.117.146.16";
        int redisPort = 6379;
        Jedis jedis;
        try {
            jedis = new Jedis(redisIP, redisPort);
            jedis.auth("[用戶名]");
            jedis.select(8);
        }
        catch (Exception e) {
            e.printStackTrace();
            System.out.printf("初始化Redis連接錯誤:%s, %d", redisIP, redisPort);
            return;
        }

        jedis.flushDB();
        long start = System.currentTimeMillis();
        notusePipeline(jedis);
        long end = System.currentTimeMillis();
        System.out.printf("不使用Pipeline的方式用時:%d毫秒", end-start);

        jedis.flushDB();
        start = System.currentTimeMillis();
        usePipeline(jedis);
        end = System.currentTimeMillis();
        System.out.printf("使用Pipeline的方式用時:%d毫秒", end-start);

    }

    private static void notusePipeline(Jedis jedis) {
        Map<String, String> mp = new HashMap<String, String>();
        try {
            for (int i=0; i<10000; i++) {
                mp.clear();
                mp.put("k"+i, "v"+i);
                jedis.hmset("keys"+i, mp);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void usePipeline(Jedis jedis) {
        Map<String, String> mp = new HashMap<String, String>();
        try {
            Pipeline pl = jedis.pipelined();
            for (int i=0; i<10000; i++) {
                mp.clear();
                mp.put("k"+i, "v"+i);
                pl.hmset("keys"+i, mp);
            }
            pl.sync();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

運行(不用配置,直接命令行運行),報錯:

初始化Redis連接錯誤:10.117.146.16, 6379

判斷因為是需要把端口設置到8000以上。

所以把Redis主庫的端口改到了8379,從庫的端口保持不變(注意改下從庫里主從同步的端口)。

另外,10000次操作實在太慢了,所以改到了1000次。(運行過程中,可以select 8,然后dbsize來看已經插入了多少條)。

現在能夠運行成功了,運行結果如下:

開始運行不使用Pipeline的方式
不使用Pipeline的方式用時:72464毫秒
開始運行使用Pipeline的方式
使用Pipeline的方式用時:173毫秒

Process finished with exit code 0

不用Pipeline的方式,跑了72秒多,平均每秒操作十多條數據。

而采用Pipeline的方式,只運行了173毫秒,吞吐量提高非常多。

這也說明了:大量的時間是在網絡交互上,Redis本身處理能力是很強的。

用更大量的數據來試一下Pipeline的時間。

10000條:
開始運行使用Pipeline的方式
使用Pipeline的方式用時:769毫秒

50000條:
開始運行使用Pipeline的方式
使用Pipeline的方式用時:1275毫秒

100000條:
開始運行使用Pipeline的方式
使用Pipeline的方式用時:7297毫秒

注意,量非常大的時候,以前用Python的經驗是,Pipeline會出錯。不知道Jedis本身會不會做優化。還是需要使用的時候,有所注意。

在降低網絡傳輸消耗,提高吞吐量,和保證每次操作成功性方面做一個好的平衡。

現在db 8里面有100000條數據,可以flushdb來刪除本db的數據,然后就可以用之前學到的命令 bgrewriteaof來壓縮aof文件了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM