Redis--流水线

在使用redis时,对于相同的数据操作,通过for循环不停的与Redis交互,这样性能不是很好,频繁的与Redis交互,耗时都是在网络中的时间,Redis支持流水线技术,一次性发送所有的数据操作,在redis服务器段一次性执行完成,这样可以大幅度的提高速度。
Demo:

redisTemplate.executePipelined(new SessionCallback<List>() {
            @Override
            public  List execute(RedisOperations operations) throws DataAccessException {
                for (int i=0;i<100;i++){
                    operations.opsForValue().set("pipeline_"+i,i,1,TimeUnit.MINUTES);
                }
                return null;
            }
        });

都只是进入队列,然后一次性执行,这样不会马上获取到数据,必须执行完成后才能获取到数据,同样如果进行大批量的数据操作,这样会返回大量执行结果,可能会导致内存溢出,这样的话,还是一个一个的去执行。
如果出现如下报错:

Callback cannot return a non-null value as it gets overwritten by the pipeline

得到的结果为执行后统一返回,所以在回调中不需要设置执行的返回值,lamada中直接返回null即可。

        List<Object> result = redisTemplate.executePipelined(new RedisCallback<List<Object>>() {
            @Override
            public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {
                for (int i = 0; i < 10; i++) {
                    connection.get(("pipeline_" + i).getBytes());
                }
                return null;
            }
        });
        System.out.println(JSON.toJSONString(result));

Jedis

    @Test
    public void test06() {
        long beginTime = System.currentTimeMillis();
        Jedis jedis = new Jedis("192.168.209.101", 6379);
        Pipeline pipelined = jedis.pipelined();
        for (int i = 0; i < 1000000; i++) {
            pipelined.hset("set02", "field" + i, "i");
        }
        List<Object> objects = pipelined.syncAndReturnAll();
        System.out.println(JSON.toJSONString(objects));
        System.out.println("耗时:" + (System.currentTimeMillis() - beginTime));
    }

Redis中提供了部分批量操作命令,比如hmget,执行时,能保证是原子的。
在这里插入图片描述
而流水线模式,进入队列后将会拆分为多个子命令,并且各个子集间可能会间隔其他命令,但是执行的结果还是一样的。
在这里插入图片描述
补充说明:

  • 注意每次执行pipline时发送的命令个数

参考
https://blog.csdn.net/qfzhangwei/article/details/86005310

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值