redis中如何使用pipeline

77次阅读
没有评论

共计 2282 个字符,预计需要花费 6 分钟才能阅读完成。

这篇文章主要为大家展示了“redis 中如何使用 pipeline”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“redis 中如何使用 pipeline”这篇文章吧。

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
基 本上四个命令需要 8 个 tcp 报文才能完成。由于通信会有网络延迟, 假如从 client 和 server 之间的包传输时间需要 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 必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并是不是打 包的命令越多越好。具体多少合适需要根据具体情况测试。下面是个 jredis 客户端使用 pipeline 的测试
package jredisStudy;
import org.jredis.JRedis;
import org.jredis.connector.ConnectionSpec;
import org.jredis.ri.alphazero.JRedisClient;
import org.jredis.ri.alphazero.JRedisPipelineService;
import org.jredis.ri.alphazero.connection.DefaultConnectionSpec;
public class PipeLineTest {
    public static void main(String[] args) {
        long start =System.currentTimeMillis();
        usePipeline();
        long end =System.currentTimeMillis();
        System.out.println(end-start);

        start = System.currentTimeMillis();
        withoutPipeline();
        end =System.currentTimeMillis();
        System.out.println(end-start);
 
    }
   
    private static void withoutPipeline()
    {
       try { 
          JRedis jredis = new JRedisClient(192.168.56.55 ,6379);
           for(int i =0 ; i 100000 ; i++)
            {
              jredis.incr(test2
            }
           jredis.quit();
     } catch (Exception e) {
     }
    }

    private static void usePipeline() {
     try {
         ConnectionSpec spec =DefaultConnectionSpec.newSpec(192.168.56.55 , 6379, 0, null);
         JRedis jredis = newJRedisPipelineService(spec);
         for(int i =0 ; i 100000 ; i++)
         {
           jredis.incr(test2
         }
         jredis.quit();
     } catch (Exception e) {
     }
    }
}
输出
103408 // 使用了 pipeline
104598 // 没有使用

测试结果不是很明显,这应该是跟我的测试环境有关。我是在自己 win 连接虚拟机的 linux。网络延迟比较小。所以 pipeline
优势不明显。如果网络延迟小的话,最好还是不用 pipeline。除了增加复杂外,带来的性能提升不明显。

以上是“redis 中如何使用 pipeline”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计2282字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)