Jedis对管道、事务以及Watch的操作详细解析
2016-06-08 16:21
330 查看
1、Pipeline
利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。所以pipeline适合批处理作业可以提升效率如:
第二个方法执行的时间是9ms
注意:pipeline和事务都是异步调用返回结果的,即并不是等待每条命令执行完立马返回结果而是等待所有命令执行完之后再返回结果。pipelined.syncAndReturnAll()返回的是参与打包执行的每条命令的结果。如果上面改成:
2、事务
事务是保证事务内的所有命令是原子操作,一般配合watch使用,事务的执行结果和pipeline一样都是采用异步的方式获取结果,multi.exec()提交事务,如果执行成功,其返回的结果和pipeline一样是所有命令的返回值,如果事务里面有两个命令那么事务的exec返回值会把两个命令的返回值组合在一起返回。如果事务被取消返回null。
3、watch
一般是和事务一起使用,当对某个key进行watch后如果其他的客户端对这个key进行了更改,那么本次事务会被取消,事务的exec会返回null。jedis.watch(key)都会返回OK
eg:
Thread-2--OK
Thread-0--OK
--->>[OK]
---null//事务取消
4、事务与管道
当对某个key进行watch时,如果其他的客户端对key进行了更改事务可以做到取消事务操作但是管道不可以
利用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.<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()返回的是参与打包执行的每条命令的结果。如果上面改成:
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进行了更改事务可以做到取消事务操作但是管道不可以
相关文章推荐
- Java并发编程-Executor框架之ScheduledThreadPoolExecutor
- 密码散列安全
- Spring3 MVC请求参数获取的几种方法
- Spring3系列13-Controller和@RequestMapping
- orcale切换mysql遇到的问题
- php.ini配置文件详解
- CSS3实现二级菜单
- Unity 脚本与工程分离
- libvirt-virsh代码解读
- 面向对象总结
- iOS单元测试UnitTest
- 小知识点
- Spring3系列12-Spring AOP AspectJ
- Spring3系列11-Spring AOP——自动创建Proxy
- Spring3系列10-Spring AOP——Pointcut,Advisor拦截指定方法
- JS检查是否为任意数(实数),正数,整数,正整数
- 4、通过私有构造器强化不可实例化的能力
- replace与replaceAll的区别
- bootstrap row 下面的 col-md 高度相等 高度 一致 高度一样 有大用
- Android Studio 中GBK中文乱码和因此无法运行程序的一些经验