jedis操作redis事務與管道
阿新 • • 發佈:2018-12-09
Jedis對管道、事務以及Watch的操作詳細解析
1、Pipeline
利用pipeline的方式從client打包多條命令一起發出,不需要等待單條命令的響應返回,而redis服務端會處理完多條命令後會將多條命令的處理結果打包到一起返回給客戶端。所以pipeline適合批處理作業可以提升效率如:
public static void testMget() {
Jedis jedis = RedisCacheClient.getInstrance().getClient();
Set<String> keys = jedis.keys("cvfeedBackHandl_*" );
List<String> result = Lists.newArrayList();
long t1 = System.currentTimeMillis();
for (String key : keys) {
result.add(jedis.get(key));
}
for (String src : result) {
System.out.println(src);
}
System.out.println (System.currentTimeMillis() - t1);
}
public static void testPipline() {
Jedis jedis = RedisCacheClient.getInstrance().getClient();
Set<String> keys = jedis.keys("cvfeedBackHandl_*");
List<Object> result = Lists.newArrayList();
Pipeline pipelined = jedis.pipelined ();
long t1 = System.currentTimeMillis();
for (String key : keys) {
pipelined.get(key);
}
result = pipelined.syncAndReturnAll();
for (Object src : result) {
System.out.println(src);
}
System.out.println(System.currentTimeMillis() - t1);
}
如第一個方法執行的時間是82ms
第二個方法執行的時間是9ms
注意:pipeline和事務都是非同步呼叫返回結果的,即並不是等待每條命令執行完立馬返回結果而是等待所有命令執行完之後再返回結果。pipelined.syncAndReturnAll()返回的是參與打包執行的每條命令的結果。如果上面改成:
for (String key : keys) {//keys長度為5
pipelined.get(key);
pipelined.del("testabcd");
}
返回結果將是
“test1”
1
“test2”
0
“test2”
0
“test4”
0
“test5”
0
2、事務
事務是保證事務內的所有命令是原子操作,一般配合watch使用,事務的執行結果和pipeline一樣都是採用非同步的方式獲取結果,multi.exec()提交事務,如果執行成功,其返回的結果和pipeline一樣是所有命令的返回值,如果事務裡面有兩個命令那麼事務的exec返回值會把兩個命令的返回值組合在一起返回。如果事務被取消返回null。
3、watch
一般是和事務一起使用,當對某個key進行watch後如果其他的客戶端對這個key進行了更改,那麼本次事務會被取消,事務的exec會返回null。jedis.watch(key)都會返回OK
eg:
public static void testWach(){
Jedis jedis = RedisCacheClient.getInstrance().getClient();
String watch = jedis.watch("testabcd");
System.out.println(Thread.currentThread().getName()+"--"+watch);
Transaction multi = jedis.multi();
multi.set("testabcd", "23432");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
List<Object> exec = multi.exec();
System.out.println("---"+exec);
jedis.unwatch();
}
public static void testWatch2(){
Jedis jedis = RedisCacheClient.getInstrance().getClient();
String watch = jedis.watch("testabcd2");
System.out.println(Thread.currentThread().getName()+"--"+watch);
Transaction multi = jedis.multi();
multi.set("testabcd", "125");
List<Object> exec = multi.exec();
System.out.println("--->>"+exec);
}
Thread-2–OK
Thread-0–OK
—>>[OK]
—null//事務取消
4、事務與管道
當對某個key進行watch時,如果其他的客戶端對key進行了更改事務可以做到取消事務操作但是管道不可以