美文网首页
springboot使用redis pipeline

springboot使用redis pipeline

作者: 陆阳226 | 来源:发表于2020-03-10 22:14 被阅读0次

springboot redis之使用pipeline

redis是基于客户端-服务器以及请求-响应协议的TCP服务,客户端向服务器发送请求是阻塞模式的,必须在等到服务器响应返回结果之后才能发送下一个请求,使用pipeline可以在服务端未响应时,继续向服务端发送请求,并最终一次性读取所有的服务端响应

  • 非pipeline:client一个请求,redis server一个响应,期间client阻塞
  • Pipeline:redis的管道命令,允许client将多个请求依次发给服务器,过程中而不需要等待请求的回复,在最后再一并读取结果即可。

springboot中使用

springboot中redisTemplate有对应的api使用pipeline方式连接:
List<Object> executePipelined(RedisCallback<?> action)
List<Object> executePipelined(SessionCallback<?> session)
在使用时只需重写RedisCallback的inRedis方法或者SessionCallback的execute方法,两者的区别是使用SessionCallback时支持开启事务(需要方法上加上@Transactional注解)

简单的使用管道测试:

public void usePipeline() {
    long start = System.currentTimeMillis();
    List<Object> list = redisTemplate.executePipelined(new SessionCallback<Object>() {

        @Override
        public Object execute(RedisOperations operations) throws DataAccessException {
            for (int i = 0; i < 50000; i++) {
                operations.opsForValue().get("city");
            }
            return null;
        }
    });
    long end = System.currentTimeMillis();
    log.info("开启管道用时: {}ms", (end - start));
}

public void noPipeline() {
    long start = System.currentTimeMillis();
    ArrayList<City> cities = new ArrayList<>();
    for (int i = 0; i < 50000; i++) {
        cities.add((City) redisTemplate.opsForValue().get("city"));
    }
    long end = System.currentTimeMillis();
    log.info("没有管道用时: {}ms", (end - start));
}

测试结果:

com.example.demo01.service.RedisService  : 开启管道用时: 3644ms
com.example.demo01.service.RedisService  : 没有管道用时: 10451ms

相关文章