zoukankan      html  css  js  c++  java
  • 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的这一限制。

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

  • 相关阅读:
    使用sshfs挂载远程服务器目录
    yum install --downloadonly 下载依赖包到本地 但不安装
    CentOS 7安装SSHFS 实现远程主机目录 挂载为本地目录
    CentOS7下FTP的安装与配置
    标签传播算法(Label Propagation Algorithm, LPA)初探
    线性模型(linear model)基本定义及参数求解数学本质、损失函数的选择与评估数学原理、及其基于线性模型衍生的其他机器学习模型相关原理讨论
    贝叶斯A/B测试
    谨慎选择我们的先验
    关于年会抢红包游戏的一个思考
    WMI攻击技术研究
  • 原文地址:https://www.cnblogs.com/ooo0/p/15788654.html
Copyright © 2011-2022 走看看