Redis 新特性---pipeline(管道)

摘要:
每个请求命令发出后client通常会阻塞并等待redis服务端处理,redis服务端处理完后将结果返回给client。redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现。由于网络开销延迟,即算redisserver端有很强的处理能力,也由于收到的client消息少,而造成吞吐量小。

转载自http://weipengfei.blog.51cto.com/1511707/1215042

Redis本身是一个cs模式的tcp server, client可以通过一个socket连续发起多个请求命令。 每个请求命令发出后client通常会阻塞并等待redis服务端处理,redis服务端处理完后将结果返回给client。

redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现。由于网络开销延迟,即算redis server端有很强的处理能力,也由于收到的client消息少,而造成吞吐量小。当client 使用pipelining 发送命令时,redis server必须部分请求放到队列中(使用内存)执行完毕后一次性发送结果;如果发送的命名很多的话,建议对返回的结果加标签,当然这也会增加使用的内存;

Pipeline在某些场景下非常有用,比如有多个command需要被“及时的”提交,而且他们对相应结果没有互相依赖,而且对结果响应也无需立即获得,那么pipeline就可以充当这种“批处理”的工具;而且在一定程度上,可以较大的提升性能,性能提升的原因主要是TCP链接中较少了“交互往返”的时间。不过在编码时请注意,pipeline期间将“独占”链接,此期间将不能进行非“管道”类型的其他操作,直到pipeline关闭;如果你的pipeline的指令集很庞大,为了不干扰链接中的其他操作,你可以为pipeline操作新建Client链接,让pipeline和其他正常操作分离在2个client中。不过pipeline事实上所能容忍的操作个数,和socket-output缓冲区大小/返回结果的数据尺寸都有很大的关系;同时也意味着每个redis-server同时所能支撑的pipeline链接的个数,也是有限的,这将受限于server的物理内存或网络接口的缓冲能力。

python 测试代码:

同时提交10000个command:

#!/usr/bin/python2
import redis
import time
def without_pipeline():
    r=redis.Redis()
    for i in range(10000):
        r.ping()
    return
def with_pipeline():
    r=redis.Redis()
    pipeline=r.pipeline()
    for i in range(10000):
        pipeline.ping()
    pipeline.execute()
    return
def bench(desc):
    start=time.clock()
    desc()
    stop=time.clock()
    diff=stop-start
    print "%s has token %s" % (desc.func_name,str(diff))
if __name__=='__main__':
    bench(without_pipeline)
    bench(with_pipeline)

测试结果:

[root@localhost ~]# python2 redis_piple.py
without_pipeline has token 1.11
with_pipeline has token 0.29

注:在本机测试,基本忽略网络延迟,pipeline还是有很高的性能的。

本文出自 “技术成就梦想” 博客,请务必保留此出处http://weipengfei.blog.51cto.com/1511707/1215042

免责声明:文章转载自《Redis 新特性---pipeline(管道)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇深入Razor,你准备好了吗?(兼谈我的学习方法和定位)Laravel5.1 响应--Response下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

redis中的hash、列表、集合操作

一、hash操作 数据结构:key:{k1:v1, k2:v2, k3:v3} 类似Python中的字典 如:info : {name: lina, age: 22, sex: F} hset key k1 v1 设置/创建(字典) hget key k1 获取key1 中 k1对应的值 批量设置获取 hmset key k2 v2 k3 v3 同时...

安装redis及异常处理

安装: 1.获取redis资源   wget http://download.redis.io/releases/redis-4.0.8.tar.gz 2.解压   tar xzvf redis-4.0.8.tar.gz 3.安装   cd redis-4.0.8   make   cd src   make install PREFIX=/usr/loc...

Redis打造URL缩短服务

用Redis打造URL缩短服务 此文章的英文版本已首发于 CodeProject :Building a simple URL shorten service with Redis 阅读文章之前,我建议你先下载源码,一边看文章,一边看代码。 代码在这里下载:http://www.codeproject.com/KB/NoSQL/819235/MicroU...

redis环境搭建(Linux)、Jredis

简介 1. NoSql是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准,ACID属性,表结构等等,这类数据库主要有一下特点:非关系型的,分布式的,开源的,水平可扩展的。2. NoSql的特点:a) 处理超大量的数据。b) 运行在便宜的pc服务器集群上c) 击碎了性能瓶颈。3. NoSql适...

redis 数据类型详解 以及 redis适用场景场合

1.  MySql+Memcached架构的问题     实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:   1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量...

Redis Desktop Manager连接Redis 遇到的一系列问题

最近在做一个土地项目的后台,主要是一个信息采集调查系统,使用的框架是: * 核心框架:Spring Framework 4.2 * 日志管理:SLF4J 1.7、Log4j 1.2 * 视图框架:Spring MVC 4.2 * 服务端验证:Hibernate Validator 5.3 * 持久层框架:MyBatis 3.3 * 数据库连接池:Aliba...