Lettuce和Jedis的基準(zhǔn)測試

原文鏈接:https://www.dubby.cn/detail.html?id=9108

1.準(zhǔn)備工作

本地需要安裝Redis,使用JMH做基準(zhǔn)測試的框架:

<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-core</artifactId>
    <version>1.21</version>
</dependency>
<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-generator-annprocess</artifactId>
    <version>1.21</version>
    <scope>provided</scope>
</dependency>

項目添加Jedis和Lettuce的依賴:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>5.0.3.RELEASE</version>
</dependency>

如果你對JMH不是很熟悉,建議你去看看Code Tools: jmh,和samples 。

2.編寫測試代碼

2.1 Jedis

@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 1)
@Threads(100)
@State(Scope.Thread)
@Measurement(iterations = 2, time = 600, timeUnit = TimeUnit.MILLISECONDS)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class JedisStudy {
    private static final int LOOP = 1;
    private Jedis jedis;
    @Setup
    public void setup() {
        jedis = new Jedis("127.0.0.1", 6379);
    }
    @Benchmark
    public void get() {
        for (int i = 0; i < LOOP; ++i) {
            jedis.get("a");
        }
    }
}
public static void main(String[] args) throws RunnerException {
    Options options = new OptionsBuilder().include(JedisStudy.class.getSimpleName())
            .output("benchmark/jedis-Throughput.log").forks(1).build();
    new Runner(options).run();
}

這里用到的注解,其中@OutputTimeUnit(TimeUnit.MILLISECONDS)很容易理解,就是測試結(jié)果的單位,@Threads(100)是開啟多少個線程測試;@Warmup(iterations = 1)是預(yù)熱的循環(huán)次數(shù);@BenchmarkMode(Mode.Throughput)是測試的模式,可以測試吞吐,延時等;@Measurement(iterations = 2, time = 600, timeUnit = TimeUnit.MILLISECONDS)是測試的循環(huán)次數(shù),以及時長;其中比較難以理解的就是@State(Scope.Thread),這里我簡單描述下吧,@State(Scope.Thread)和下面的@Setup配合使用,意思是每個測試線程,都會使用獨立的一個變量,這個變量就是Jedis jedis,使用@Setup所修飾的方法來做初始化。

參考JMHSample_03_States JMHSample_04_DefaultState 。

其中因為Jedis是線程不安全的,所以每個線程使用的都是一個單獨的Jedis對象,這里可以使用Pool來優(yōu)化,讀者如果感興趣,可以嘗試。

2.2 Lettuce

@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 1)
@Threads(100)
@State(Scope.Benchmark)
@Measurement(iterations = 2, time = 600, timeUnit = TimeUnit.MILLISECONDS)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class LettuceAsyncStudy {
    private static final int LOOP = 1;
    private StatefulRedisConnection<String, String> connection;
    @Setup
    public void setup() {
        RedisClient client = RedisClient.create("redis://localhost");
        connection = client.connect();
    }
    @Benchmark
    public void get() throws ExecutionException, InterruptedException {
        RedisAsyncCommands<String, String> commands = connection.async();
        List<RedisFuture<String>> redisFutureList = new ArrayList<>();
        for (int i = 0; i < LOOP; ++i) {
            RedisFuture<String> future = commands.get("a");
            redisFutureList.add(future);
            future.get();
        }
        redisFutureList.forEach(f -> {
            try {
                f.get();
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }
}
public static void main(String[] args) throws RunnerException {
    Options options = new OptionsBuilder().include(LettuceAsyncStudy.class.getSimpleName())
            .output("benchmark/lettuceAsync-Throughput.log").forks(1).build();
    new Runner(options).run();
}

這里和上面Jedis的區(qū)別就是@State(Scope.Benchmark),其實就是StatefulRedisConnection<String, String> connection這個對象是所有測試線程共享的,因為Lettuce的StatefulRedisConnection是線程的安全的,所以可以這么用。

3.測試結(jié)果

Client 線程數(shù)(并發(fā)數(shù)) 每次測試方法里循環(huán)執(zhí)行g(shù)et的次數(shù) Throughput(ops/ms)
Jedis 100 1 46.628
Lettuce 100 1 106.589
-- -- -- --
Jedis 100 10 5.307
Lettuce 100 10 14.802
-- -- -- --
Jedis 100 100 0.483
Lettuce 100 100 1.599
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • ---雷東儒詩歌創(chuàng)作談 因為我放的牛能做到“十步啃一片,幾里不留行”的糟蹋莊稼,所以小時候,至少在方圓...
    東儒閱讀 429評論 0 2
  • 從未用過如此明快的顏色 覆蓋我的雙眸 像阿爾卑斯山頂凝結(jié)的冰晶 像麥田里稻草人清澈的雙眼 遠(yuǎn)方的樹叢 阻擋了列車前...
    解_放閱讀 267評論 0 6
  • 作者:支付寶彭蕾 虎嗅網(wǎng) 11月29日消息,針對近期支付寶“校園日記”等圈子引發(fā)的爭議,支付寶母公司螞蟻金服的董事...
    Sting閱讀 368評論 0 0
  • 起雨時,窗外的雨靜靜地落著,一滴一滴連起來,像是竄成的珠簾,窗外的雨如煙似霧密密地斜織著,無聲無息地滋潤著大地,窗...
    平安是福_1afa閱讀 303評論 1 0