日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java hgetall_详解Java使用Pipeline对Redis批量读写(hmsethgetall)

發(fā)布時(shí)間:2023/12/14 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java hgetall_详解Java使用Pipeline对Redis批量读写(hmsethgetall) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一般情況下,Redis Client端發(fā)出一個(gè)請(qǐng)求后,通常會(huì)阻塞并等待Redis服務(wù)端處理,Redis服務(wù)端處理完后請(qǐng)求命令后會(huì)將結(jié)果通過(guò)響應(yīng)報(bào)文返回給Client。

感覺這有點(diǎn)類似于HBase的Scan,通常是Client端獲取每一條記錄都是一次RPC調(diào)用服務(wù)端。

在Redis中,有沒(méi)有類似HBase Scanner Caching的東西呢,一次請(qǐng)求,返回多條記錄呢?

通過(guò)pipeline方式當(dāng)有大批量的操作時(shí)候,我們可以節(jié)省很多原來(lái)浪費(fèi)在網(wǎng)絡(luò)延遲的時(shí)間,需要注意到是用pipeline方式打包命令發(fā) 送,redis必須在處理完所有命令前先緩存起所有命令的處理結(jié)果。打包的命令越多,緩存消耗內(nèi)存也越多。所以并不是打包的命令越多越好。

使用Pipeline在對(duì)Redis批量讀寫的時(shí)候,性能上有非常大的提升。

Java測(cè)試了一下:

package com.lxw1234.redis;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.Pipeline;

import redis.clients.jedis.Response;

public class Test {

public static void main(String[] args) throws Exception {

Jedis redis = new Jedis("127.0.0.1", 6379, 400000);

Map data = new HashMap();

redis.select(8);

redis.flushDB();

//hmset

long start = System.currentTimeMillis();

//直接hmset

for (int i=0;i<10000;i++) {

data.clear();

data.put("k_" + i, "v_" + i);

redis.hmset("key_" + i, data);

}

long end = System.currentTimeMillis();

System.out.println("dbsize:[" + redis.dbSize() + "] .. ");

System.out.println("hmset without pipeline used [" + (end - start) / 1000 + "] seconds ..");

redis.select(8);

redis.flushDB();

//使用pipeline hmset

Pipeline p = redis.pipelined();

start = System.currentTimeMillis();

for (int i=0;i<10000;i++) {

data.clear();

data.put("k_" + i, "v_" + i);

p.hmset("key_" + i, data);

}

p.sync();

end = System.currentTimeMillis();

System.out.println("dbsize:[" + redis.dbSize() + "] .. ");

System.out.println("hmset with pipeline used [" + (end - start) / 1000 + "] seconds ..");

//hmget

Set keys = redis.keys("*");

//直接使用Jedis hgetall

start = System.currentTimeMillis();

Map> result = new HashMap>();

for(String key : keys) {

result.put(key, redis.hgetAll(key));

}

end = System.currentTimeMillis();

System.out.println("result size:[" + result.size() + "] ..");

System.out.println("hgetAll without pipeline used [" + (end - start) / 1000 + "] seconds ..");

//使用pipeline hgetall

Map>> responses = new HashMap>>(keys.size());

result.clear();

start = System.currentTimeMillis();

for(String key : keys) {

responses.put(key, p.hgetAll(key));

}

p.sync();

for(String k : responses.keySet()) {

result.put(k, responses.get(k).get());

}

end = System.currentTimeMillis();

System.out.println("result size:[" + result.size() + "] ..");

System.out.println("hgetAll with pipeline used [" + (end - start) / 1000 + "] seconds ..");

redis.disconnect();

}

}

測(cè)試結(jié)果如下:

dbsize:[10000] ..

hmset without pipeline used [243] seconds ..

dbsize:[10000] ..

hmset with pipeline used [0] seconds ..

result size:[10000] ..

hgetAll without pipeline used [243] seconds ..

result size:[10000] ..

hgetAll with pipeline used [0] seconds ..

使用pipeline來(lái)批量讀寫10000條記錄,就是小菜一碟,秒完。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

總結(jié)

以上是生活随笔為你收集整理的java hgetall_详解Java使用Pipeline对Redis批量读写(hmsethgetall)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。