【发布时间】:2013-05-22 16:49:27
【问题描述】:
据说pipeline在redis中需要很多set/get的时候比较好,所以这是我的测试代码:
public class TestPipeline {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JedisShardInfo si = new JedisShardInfo("127.0.0.1", 6379);
List<JedisShardInfo> list = new ArrayList<JedisShardInfo>();
list.add(si);
ShardedJedis jedis = new ShardedJedis(list);
long startTime = System.currentTimeMillis();
ShardedJedisPipeline pipeline = jedis.pipelined();
for (int i = 0; i < 100000; i++) {
Map<String, String> map = new HashMap<String, String>();
map.put("id", "" + i);
map.put("name", "lyj" + i);
pipeline.hmset("m" + i, map);
}
pipeline.sync();
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
}
当我运行它时,这个程序有一段时间没有响应,但是当我不使用pipe时,它只需要20073毫秒,所以我很困惑为什么没有pipeline会更好和差距多么大!
谢谢你的回答,几个问题,6MB数据怎么计算? 当我发送 10K 数据时,管道总是比普通模式快,但是对于 100k,管道将没有响应。我认为 100-1000 次操作是一个明智的选择,如下所述。我不明白 JIT 有什么问题吗?
【问题讨论】:
-
即使 20 秒听起来也很长。我假设管道允许发送异步更新,并且没有管道更新是同步的。
-
+1 你启发我写了这个测试Insert one million into Chronicle,它在我的笔记本电脑上打印了
1,000,000 inserts took 1.208 seconds。