redis 流水线

Redis提供的流水线特性:这个特性允许客户端把任意多条Redis命令请求打包在一起,然后一次性地将它们全部发送给服务器,而服务器则会在流水线包含的所有命令请求都处理完毕之后,一次性地将它们的执行结果全部返回给客户端。

通过使用流水线特性,我们可以将执行多个命令所需的网络通信次数从原来的N次降低为1次,这可以大幅度地减少程序在网络通信方面耗费的时间,使得程序的执行效率得到显著的提升。

    @ApiOperation("testSingle")
    @GetMapping("/testSingle")
    public Map<String, Object> testSingle() {

        Long start = System.currentTimeMillis();

        for (int i = 0; i < 10000; i++) {
            String key = "pipeline_" + i;
            String value = "value_" + i;
            redisTemplate.opsForValue().set(key, value);
        }

        Long end = System.currentTimeMillis();
        System.out.println("Single插入10000条记录耗时:" + (end - start) + "毫秒。");//Single插入10000条记录耗时:6349毫秒。

        Map<String, Object> map = new HashMap<>();
        map.put("success", true);
        return map;
    }

  

@ApiOperation("testPipeline")
    @GetMapping("/testPipeline")
    public Map<String, Object> testPipeline() {

        Long start = System.currentTimeMillis();
        List List = redisTemplate.executePipelined(new RedisCallback<Long>() {
            @Override
            public Long doInRedis(RedisConnection connection) throws DataAccessException {
                connection.openPipeline();
                for (int i = 10001; i < 20000; i++) {
                    String key = "pipeline_" + i;
                    String value = "value_" + i;
                    connection.set(key.getBytes(), value.getBytes());
                }
                return null;
            }
        });

        Long end = System.currentTimeMillis();
        System.out.println("Pipeline插入10000条记录耗时:" + (end - start) + "毫秒。");//Pipeline插入10000条记录耗时:605毫秒。

        Map<String, Object> map = new HashMap<>();
        map.put("success", true);
        return map;
    }

  

流水线使用注意事项

虽然Redis服务器并不会限制客户端在流水线中包含的命令数量,但是却会为客户端的输入缓冲区设置默认值为1GB的体积上限:当客户端发送的数据量超过这一限制时,Redis服务器将强制关闭该客户端。因此用户在使用流水线特性时,最好不要一下把大量命令或者一些体积非常庞大的命令放到同一个流水线中执行,以免触碰到Redis的这一限制。

除此之外,很多客户端本身也带有隐含的缓冲区大小限制,如果你在使用流水线特性的过程中,发现某些流水线命令没有被执行,或者流水线返回的结果不完整,那么很可能就是你的程序触碰到了客户端内置的缓冲区大小限制。在遇到这种情况时,请缩减流水线命令的数量及其体积,然后再进行尝试。

原文地址:https://www.cnblogs.com/ooo0/p/15788654.html