Jedis对管道、事务以及Watch的操作详细解析
来源:互联网 发布:python opencv3.0 svm 编辑:程序博客网 时间:2024/05/16 16:01
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.<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进行了更改事务可以做到取消事务操作但是管道不可以
0 0
- Jedis对管道、事务以及Watch的操作详细解析
- Java Jedis操作Redis示例(五)——Redis的事务、管道和脚本
- 使用Redisson、Jedis对redis进行管道操作(JAVA)
- Jedis的八种调用方式(事务、管道、分布式)
- Jedis的八种调用方式(事务、管道、分布式)介绍
- Jedis对redis的操作详解
- Jedis对redis的操作详解
- Redis jedis对数据类型的操作
- Jedis对redis的操作详解
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式等)介绍
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍
- 在android中使用Realm数据库框架
- js 中object对象转json
- 【Swift】UISearchBar输入框的背景颜色
- LaunchImage和LaunchScreen.xib混用出现的坑
- 浅议 Dynamic_cast 和 RTTI
- Jedis对管道、事务以及Watch的操作详细解析
- opencv 学习笔记 (图像基础)
- c链表
- Kotlin
- UML-类图
- oracle自动分区设置
- 进程间通信匿名管道
- Reverse Bits
- 一周stackoverflow热门问题选登:如何用Python for循环实现列表中数据两两循环打印?