java连接redis数据库,其中事务和管道怎样同时使用?

2025-04-13 06:39:59
推荐回答(1个)
回答1:

一、普通同步方式
最简单和基础的调用方式,
@Testpublic void test1Normal() {
Jedis jedis = new Jedis("localhost"); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) {
String result = jedis.set("n" + i, "n" + i);
} long end = System.currentTimeMillis();
System.out.println("Simple SET: " + ((end - start)/1000.0) + " seconds");
jedis.disconnect();
}1234567891011

很简单吧,每次set之后都可以返回结果,标记是否成功。
二、事务方式(Transactions)
redis的事务很简单,他主要目的是保障,一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。
看下面例子:
@Testpublic void test2Trans() {
Jedis jedis = new Jedis("localhost"); long start = System.currentTimeMillis();
Transaction tx = jedis.multi(); for (int i = 0; i < 100000; i++) {
tx.set("t" + i, "t" + i);
}
List results = tx.exec(); long end = System.currentTimeMillis();
System.out.println("Transaction SET: " + ((end - start)/1000.0) + " seconds");
jedis.disconnect();
}12345678910111213

我们调用jedis.watch(…)方法来监控key,如果调用后key值发生变化,则整个事务会执行失败。另外,事务中某个操作失败,并不会回滚其他操作。这一点需要注意。还有,我们可以使用discard()方法来取消事务。
三、管道(Pipelining)
有时,我们需要采用异步方式,一次发送多个指令,不同步等待其返回结果。这样可以取得非常好的执行效率。这就是管道,调用方法如下:
@Testpublic void test3Pipelined() {
Jedis jedis = new Jedis("localhost");
Pipeline pipeline = jedis.pipelined(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) {
pipeline.set("p" + i, "p" + i);
}
List results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis();
System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds");
jedis.disconnect();
}