【转载】Jedis对管道、事务以及Watch的操作详细解析
2017-02-20 16:42
387 查看
转载地址:http://blog.csdn.net/liyantianmin/article/details/51613772
1、Pipeline
利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而Redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。所以pipeline适合批处理作业可以提升效率如:
[java] view plain copy
print?
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.<span style="font-family: Arial;">get</span>("testabcd");
}
result = pipelined.syncAndReturnAll();
for (Object src : result) {
System.out.println(src);
}
System.out.println(System.currentTimeMillis() - t1);
}
如第一个方法执行的时间是82ms
第二个方法执行的时间是9ms
注意:pipeline和事务都是异步调用返回结果的,即并不是等待每条命令执行完立马返回结果而是等待所有命令执行完之后再返回结果。pipelined.syncAndReturnAll()返回的是参与打包执行的每条命令的结果。如果上面改成:
[java] view plain copy
print?
for (String key : keys) {//keys长度为5
pipelined.get(key);
pipelined.del("testabcd");
}
返回结果将是
[java] view plain copy
print?
"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:
[java] view plain copy
print?
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进行了更改事务可以做到取消事务操作但是管道不可以
1、Pipeline
利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而Redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。所以pipeline适合批处理作业可以提升效率如:
[java] view plain copy
print?
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.<span style="font-family: Arial;">get</span>("testabcd");
}
result = pipelined.syncAndReturnAll();
for (Object src : result) {
System.out.println(src);
}
System.out.println(System.currentTimeMillis() - t1);
}
如第一个方法执行的时间是82ms
第二个方法执行的时间是9ms
注意:pipeline和事务都是异步调用返回结果的,即并不是等待每条命令执行完立马返回结果而是等待所有命令执行完之后再返回结果。pipelined.syncAndReturnAll()返回的是参与打包执行的每条命令的结果。如果上面改成:
[java] view plain copy
print?
for (String key : keys) {//keys长度为5
pipelined.get(key);
pipelined.del("testabcd");
}
返回结果将是
[java] view plain copy
print?
"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:
[java] view plain copy
print?
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进行了更改事务可以做到取消事务操作但是管道不可以
相关文章推荐
- Jedis对管道、事务以及Watch的操作详细解析
- 【Redis】1、Jedis对管道、事务以及Watch的操作来应对高并发
- 【转载】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍--转载
- 24.Linux:嵌入式sqlite3数据库事务理解以及实例操作 (转载)
- Java Jedis操作Redis示例(五)——Redis的事务、管道和脚本
- spring框架多个数据库操作需统一提交事务回滚机制解析以及解决办法
- 支持up,down以及pageup,pagedown,home,end,Enter键盘操作的DataGrid[转载]
- VC对于XML的解析以及操作
- 温故而知新:查看端口占用情况以及DOS中的管道操作/重定向操作
- C语言文件操作解析(一)[转载]
- (转载)使用 jsoup 对 HTML 文档进行解析和操作
- ASP.NET的各种异步操作实现详细解析
- Server操作Mxd文件详细讲解(转载)
- 深入解析javascript与asp.net对Cookie操作的异同,以及如何共用(一)。
- iphone 开发Categories 、Extensions 以及相关应用(详细解析)
- hbase 详细解析(转载)
- 【转载】【点评】详细解析C语言中的sizeof
- iphone 开发Categories 、Extensions 以及相关应用(详细解析)
- PHP XML操作的各种方法解析(比较详细)