Redis管道-pipeline

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);
    }
}



参考链接:https://www.cnblogs.com/yepei/p/5662734.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值