Redis管道的作用
使用pipeline的方式将命令打包发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。
当我们使用客户端对 Redis 进行一次操作时,客户端将请求传送给服务器,服务器处理完毕后,再将响应回复给客户端。这要花费一个网络数据包来回的时间。 如果连续执行多条指令,那就会花费多个网络数据包来回的时间。
Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。
Redis 管道 (Pipeline) 本身并不是 Redis 服务器直接提供的技术,这个技术本质上是由客户端提供的。
Redis管道常用方法
pipelined():开启管道
sync():将管道中的命令发送给Redis执行
syncAndReturnAll():将管道中的命令发送给Redis执行,并返回结果。返回结果是一个按命令执行顺序返回的list,
注意:无法在管道开启中获取到查询操作的结果,必须等待执行sycn()后才能获取到结果
小知识点 try-with-resource
所有实现了 java.lang.AutoCloseable 接口(其中,它包括实现了 java.io.Closeable 的所有对象),使用try-with-resource语法,无需自己编写close方法。jdk底层会自动帮我们调用close方法
try(Resource res = new Resource()) {
res.doSome();
} catch(Exception ex) {
ex.printStackTrace();
}
使用Demo
package com.study.redis管道pipeline;
import java.util.List;
import org.apache.log4j.Logger;
import com.study.utils.RedisSimplePool;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
package com.study.redis管道pipeline;
import java.util.List;
import org.apache.log4j.Logger;
import com.study.utils.RedisSimplePool;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
/**
*
* @描述: 使用redis 管道Pipeline,将命令打包推送,按顺序返回执行结果
* 中间某个命令执行报错,并不会影响后面命令的执行。报错会返回一个异常对象JedisDataException
* @版权: Copyright (c) 2020
* @公司:
* @作者: 严磊
* @版本: 1.0
* @创建日期: 2020年5月31日
* @创建时间: 上午11:06:07
*/
public class RedisPipeline
{
private static final Logger logger = Logger.getLogger(RedisPipeline.class);
public static void main(String[] args)
{
Jedis jedis = RedisSimplePool.getJedis();
//try-with-resource Resource的定义:所有实现了 java.lang.AutoCloseable 接口(其中,它包括实现了 java.io.Closeable 的所有对象),可以使用作为资源
try (Pipeline pipeline = jedis.pipelined())
{
String key = "pipeline_map_key1";
pipeline.hset(key, "field1", "value1");
pipeline.hset(key, "field2", "value2");
pipeline.hset(key, "field3", "value3");
pipeline.expire(key, 30);//过期时间30秒
Response<String> hgetResponse = pipeline.hget(key, "field3");
System.out.println("在管道操作的中途,无法获取到结果:"+hgetResponse);
pipeline.incrBy("pipeline_map_key1", 1);//报错 redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value
key = "pipeline_map_key2";
pipeline.hset(key, "field1", "value1");
pipeline.hset(key, "field2", "value2");
pipeline.hset(key, "field3", "value3");
pipeline.expire(key, 60);//过期时间30秒
List<Object> result = pipeline.syncAndReturnAll();
System.out.println("管道批量执行后返回的结果:"+result);
System.out.println("管道批量执行后可以获取到结果:"+hgetResponse.get());
}
catch (Exception ex)
{
logger.error("资源关闭时发生Exception", ex);
}
RedisSimplePool.returnJedis(jedis);
}
}