多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 简介 利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而Redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。所以pipeline适合批处理作业可以提升效率 # 管道 异步的方式,一次发送多个指令,并且,不同步等待其返回结果。这样可以取得非常好的执行效率。 ~~~ Jedis jedis = this.init(); Set<String> keys = jedis.keys("k*"); List<Object> list = new ArrayList<>(); Pipeline pipelined = jedis.pipelined(); for (String key : keys) { pipelined.set(key, key + "---"); } pipelined.sync(); ~~~ 如果要返回参与打包执行的每条命令的结果 就可以这样写 ~~~ List<Object> list = pipelined.syncAndReturnAll(); System.out.println(list); ~~~ # 管道中调用事务 在某种需求下,我们需要异步执行命令,但是,又希望多个命令是有连续的,所以,我们就采用管道加事务的调用方式。jedis是支持在管道中调用事务的。 效率上可能会有所欠缺 ~~~ Jedis jedis = this.init(); Pipeline pipelined = jedis.pipelined(); pipelined.multi(); for (int i = 0; i < 5; i++) { pipelined.set("k-" + i, "v-" + i); } pipelined.exec(); //返回每个执行结果 List<Object> list = pipelined.syncAndReturnAll(); System.out.println(list); ~~~ 输出 ~~~ [OK, QUEUED, QUEUED, QUEUED, QUEUED, QUEUED, [OK, OK, OK, OK, OK]] ~~~ # 注意 事务和管道都是异步模式。在事务和管道中不能同步查询结果。比如下面两个调用,都是不允许的: ## 管道中同步查询 ~~~ Jedis jedis = this.init(); Pipeline pipelined = jedis.pipelined(); for (int i = 0; i < 5; i++) { System.out.println(pipelined.get("k-" + i)); } //返回每个执行结果 List<Object> list = pipelined.syncAndReturnAll(); System.out.println(list); ~~~ 返回 ~~~ Response string Response string Response string Response string Response string [v-0, v-1, v-2, v-3, v-4] ~~~ 如果要查询就要在最后用syncAndReturnAll接收就行 ## 事务中同步查询 ~~~ Jedis jedis = this.init(); Transaction multi = jedis.multi(); for (int i = 0; i < 5; i++) { System.out.println(multi.get("k-" + i)); } List<Object> exec = multi.exec(); System.out.println(exec); ~~~ 返回 ~~~ Response string Response string Response string Response string Response string [v-0, v-1, v-2, v-3, v-4] ~~~ 要知道结果就在最后获取就行