`
y806839048
  • 浏览: 1084553 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

redis Pipeliningz批处理节约时间

阅读更多

管道就是批处理命令,防止每条命令---请求一次tcp连接,返回一次tcp这样消耗大,管道就是把所有的命令打包发给redise服务端,统一处理之后统一返回,

所以不能以前面返回的作为操作对象

 

 

 

 

redis是一个cs模式的tcp server,使用和http类似的请求响应协议。一个client可以通过一个socket连接发起多个请求命令。每个请求命令发出后client通常会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client。基本的通信过程如下:

Client: INCR X
Server: 1
Client: INCR X
Server: 2
Client: INCR X
Server: 3
Client: INCR X
Server: 4

基本上四个命令需要8tcp报文才能完成。由于通信会有网络延迟,假如从clientserver之间的包传输时间需要0.125秒。那么上面的四个命令8个报文至少会需要1秒才能完成。这样即使redis每秒能处理100个命令,而我们的client也只能一秒钟发出四个命令。这显示没有充分利用 redis的处理能力。除了可以利用mget,mset 之类的单条命令处理多个key的命令外我们还可以利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。通信过程如下:

Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4

假设不会因为tcp报文过长而被拆分。可能两个tcp报文就能完成四条命令,client可以将四个incr命令放到一个tcp报文一起发送,server则可以将四条命令的处理结果放到一个tcp报文返回。通过pipeline方式当有大批量的操作时候。我们可以节省很多原来浪费在网络延迟的时间。需要注意到是用 pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并是不是打包的命令越多越好。具体多少合适需要根据具体情况测试。下面是个jedis客户端使用pipeline的测试:

package com.jd.redis.client;

 

import redis.clients.jedis.Jedis;

import redis.clients.jedis.Pipeline;

 

publicclass PipelineTest {

 

    /**

     * @param args

     */

    publicstaticvoid main(String[] args) {

       

        int count = 1000;

       

        long start = System.currentTimeMillis();

        withoutPipeline(count);

        long end = System.currentTimeMillis();

        System.out.println("withoutPipeline: " + (end-start));

       

        start = System.currentTimeMillis();

        usePipeline(count);

        end = System.currentTimeMillis();

        System.out.println("usePipeline: " + (end-start));

       

    }

 

    privatestaticvoid withoutPipeline(int count){

        Jedis jr = null;

        try {

            jr = new Jedis("10.10.224.44", 6379);

            for(int i =0; i<count; i++){

                jr.incr("testKey1");

            }

        catch (Exception e) {

            e.printStackTrace();

        }

        finally{

            if(jr!=null){

                jr.disconnect();

            }

        }

    }

   

    privatestaticvoid usePipeline(int count){

        Jedis jr = null;

        try {

            jr = new Jedis("10.10.224.44", 6379);

            Pipeline pl = jr.pipelined();

            for(int i =0; i<count; i++){

                 pl.incr("testKey2");

            }

                pl.sync();

        catch (Exception e) {

            e.printStackTrace();

        }

        finally{

            if(jr!=null){

                jr.disconnect();

            }

        }

    }

}

输出:

withoutPipeline: 11341

usePipeline: 344

测试结果还是很明显有较大的差距,所以多次操作用pipeline还是有明显的优势。我用的是Win7中的Jedis Java客户端程序连接局域网的Linux虚拟机上的Redis Server

分享到:
评论

相关推荐

    redis集群批处理一键搭建

    redis集群4节点安装搭建 直接bat一健搭建不用配置直接可用,支持64位操作系统

    redis批处理.bat脚本

    redis批处理.bat脚本

    Windows下 redis 注册服务 启动 关闭 批处理 bat

    需要在redis目录下运行 快捷方式可放置桌面 包含redis注册服务 启动 关闭批处理 其实就是三行命令合一个bat 每个bat开头是获取系统管理员

    Windows一键配置启动redis,停止redis

    在redis官网原装包,安全无毒,自己编写的redis相关批处理文件,注意:Redis一定要解压到C盘根目录,本人能力有限,没办法做到全盘扫描获取

    redis-64.3.0.503 64位redis安装文件,直接运行批处理安装

    Redis-64.3.0.503 64位redis安装文件,直接运行批处理安装 和卸载,简单方便操作

    Windows 上安装 Redis安装,redis7.2安装到windows上面

    Windows 上安装 Redis安装Windows 上安装 Redis安装Windows 上安装 Redis安装Windows 上安装 Redis安装Windows 上安装 Redis安装Windows 上安装 Redis安装Windows 上安装 Redis安装Windows 上安装 Redis安装Windows ...

    redis启动服务

    redis的启动批处理文件(.bat) 

    redis-recovery:时间点redis恢复工具

    redis point-in-time recovery 准备工作 用supervisor运行 set_redis_timestamp_key.py ,会自动每秒设置时间戳,需要在里面配置支持的redis地址列表,可在局域网任何一台机器运行。 每天午夜运行 backup_and_...

    redis-5.0.4.tar.gz下载及redis安装过程

    redis安装 1: 下载redis-5.0.4.tar.gz 2: 解压源码并进入目录 tar zxvf redis-5.0.4.tar.gz cd redis-5.0.4 3: 不用configure 4: 直接make (如果是32位机器 make 32bit) 查看linux机器是32位还是64位的方法:...

    redisredis redis redis redis

    redisredis redis redis redis

    Redis 实践

    节约内存:Redis实践,节约内存:Redis实践

    redis-windows-7.0.11

    Redis是一种开源的内存数据结构存储系统,它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。Redis可以用作数据库、缓存和消息中间件。Redis在性能、可扩展性和灵活性方面表现出色,因此被广泛应用于Web...

    Redis 7.0.4 x64位 windows 系统 安装包 Redis7.0.4.zip

    Redis7.0.4.zip,解压缩到D盘根目录后,安装后启动为Windows服务 注意是windows 64位系统才可使用,不支持windows 32位系统使用 已经在Win10,Win11,Windows server 2012系统测试运行可用 使用步骤注意事项: ...

    Redis实战Redis实战

    Redis实战 Redis实战 Redis实战 Redis实战 Redis实战 Redis实战 Redis实战

    redis6.2.6 redis.conf配置文件

    redis6.2.6 redis.conf配置文件

    redis-5.0.5.tar.gz

    redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-5.0.5.redis-...

    若依前后端分离版去redis版/无redis版本

    基于前后端分离的应用,无论是否使用Redis,都需要考虑如何进行数据的存储和缓存。下面我将分别介绍基于Redis和无Redis的两种版本的特点。 基于Redis的版本 特点 缓存处理:Redis作为内存数据库可以用来缓存频繁访问...

    Redis_redis_

    Redis 思维导图 Redis Redis Redis

    Redis面试题50道(含答案)_.pdf

    28、Redis key 的过期时间和永久有效分别怎么设置? 29、Redis 如何做内存优化? 30、Redis 回收进程如何工作的? 31、Redis 回收使用的是什么算法? 32、Redis 如何做大量数据插入? 33、为什么要做 Redis 分区? ...

    Redis Desktop Manager 2020.0.79 for Mac

    Redis Desktop Manager 2020 for Mac(又名RDM)—款快速 Redis 数据库管理应用。可以与 Amazon ElastiCache,Microsoft Azure Redis Cache 和 Redis Labs 等服一起使用。使用 RDM 分析您的Redis服务器内存使用情况...

Global site tag (gtag.js) - Google Analytics