一、pipeline出现的原因

1.Redis执行命令的过程

redis客户端执行一条命令的过程:

发送命令-〉命令排队-〉命令执行-〉返回结果

使用python给redis发送命令时的过程:

  1. 客户端发送请求,获取socket,阻塞等待返回;
  2. 服务端执行命令并将结果返回给客户端;

2.效率提升

当redis需要执行的命令较多时,这样的一来一回的网络传输所消耗的时间被称为RTT(Round Trip Time),显而易见,如果可以将这些命令作为一个请求一次性发送给服务端,并一次性将结果返回客户端,会节约很多网络传输的消耗,可以大大提升响应时间。因此我们python中通过pipeline来进行效率提升。

二、pepeline的性能

1、未使用pipeline执行N条命令

2、使用了pipeline执行N条命令

两种方式中:使用Pipeline执行速度比逐条执行要快,特别是客户端与服务端的网络延迟越大,性能体能越明显

三、原生批命令与Pipeline对比

原始批命令:(mset, mget)

四、pipeline的简单使用

1.简单的使用

# coding:utf-8
import redisr = redis.StrictRedis.from_url('redis://127.0.0.1/0')
# 创建管道对象
pipe = r.pipeline()
pipe.set('name', '张三')
pipe.set('age', 15)
pipe.set('gender', '男')
# 执行
pipe.execute()

2.pipeline支持命令写在一起

# coding:utf-8
import redisr = redis.StrictRedis.from_url('redis://127.0.0.1/0')
pipe = r.pipeline()
# pipeline支持命令写在一起
pipe.set('hello', 'redis').sadd('faz', 'baz').incr('num').execute()

3.pipeline配合上下文管理器

# coding:utf-8
import redisr = redis.StrictRedis.from_url('redis://127.0.0.1/0')
# 创建管道对象,一般配合上下文管理器使用
with r.pipeline() as pipe:pipe.set('name', '张三')pipe.set('age1', '12')pipe.set('age2', '121')pipe.set('age3', '1212')pipe.set('age4', '12121')try:# 执行pipe.execute()except Exception as e:print e

4.批量接收pipeline的值

# coding:utf-8
import redisr = redis.StrictRedis.from_url('redis://127.0.0.1/0')# 往num_list中添加100个值
with r.pipeline() as pipe:for i in range(1, 101):pipe.lpush('num_list'.format(i), i)try:pipe.execute()except Exception as e:print e# 从num_list中取出所有值
num_len=r.llen('num_list')
with r.pipeline() as pipe:for i in range(num_len):pipe.rpop('num_list')try:result = pipe.execute()print resultexcept Exception as e:print e

批量接收pipeline的值会以列表形式返回

5.pipeline配合事务的操作

默认pipeline中支持事务,若想关闭事务,则创建pipeline的时候:

pipe = r.pipeline(transaction=False)

错误总结

①开启事务时候命令出错

把set写成settt造成语法错误

# coding:utf-8
import redisr = redis.StrictRedis.from_url('redis://127.0.0.1/0')
# 创建管道对象,一般配合上下文管理器使用
with r.pipeline() as pipe:pipe.set('name', '张三')pipe.settt('age',18)try:# 执行pipe.execute()except Exception as e:print e

语法错误,整个事务无法执行,控制台报错,数据库也不会执行。

②开启事务时候运行出错

错将str求长度写成列表求长度的命令,在redis执行过程中报错

# coding:utf-8
import redisr = redis.StrictRedis.from_url('redis://127.0.0.1/0')
# 创建管道对象,一般配合上下文管理器使用
with r.pipeline() as pipe:pipe.set('name', '张三')pipe.llen('name')pipe.set('name2', '李四')try:# 执行pipe.execute()except Exception as e:print e

在执行过程中发现命令报错,那么命令错误的语句无法执行,不会影响其他命令

未改进的小例子

import redis
import time
import jsonhost = "127.0.0.1"
port = 6379
password = "ics12345"
redis_list_name = "dga-metadata"redis_conn = redis.Redis(host, port, 0, password, decode_responses=True)
pipe = redis_conn.pipeline()
count = 0
www = 10000
while www:#data = redis_conn.rpop(redis_list_name)pipe.rpop(redis_list_name)#print(data)www -= 1count += 1if count % 1000 == 0:print(count)
data = pipe.execute()
print("end", len(data))
aaa = []
for item in data:if not item is None:json.loads(item)aaa.append(item)
print("end2", len(aaa))

Python中使用Redis的批处理工具pipeline(这种方法从底层思考效率还是低于“订阅发布机制”)相关推荐

  1. python图片-Python中的十大图像处理工具

    原标题:Python中的十大图像处理工具 导读:本文主要介绍了一些简单易懂最常用的Python图像处理库. 作者:Parul Pandey 来源:大数据文摘(ID:BigDataDigest) 当今世 ...

  2. python中异常好用的工具

    [TOC] python中异常好用的工具 PrettyErrors 安装 它的安装特别的简单,直接pip就可以 pip install pretty_errors #没有安装pip的,可以采用下面的方 ...

  3. Python redis的订阅发布机制(publish、pubsub)

    为什么用订阅发布机制?原因在于它的速度要比pop.push快很多. 先介绍一下redis的pub/sub功能: Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能. ...

  4. python中用于释放类占用的资源的方法是()_mooc大学英语词汇期末答案

    把两个已有项目放到一起,就是一个新项目,这种项目来源属于(?? ) 答:整合 辩证法同形而上学的斗争 答:是从属于唯物主义同唯心主义的斗争,并同这种斗争交织在一起的 中国大学MOOC: 广义的计划是对 ...

  5. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  6. python中常见的三种选择结构_在Python中,实现多分支选择结构的最佳方法是

    在Python中,实现多分支选择结构的最佳方法是 答:if-elif-else 绘制建筑平面图时,被剖切的墙用 线绘制,定位轴线用 线绘制 答:粗实 细点画 智慧职教: 下列关于书写住院病历的叙述不正 ...

  7. 介绍python中几种遍历列表的for循环方法

    我们在使用列表的过程中,经常需要遍历列表的所有元素,对每个元素执行相同的操作.今天就给大家介绍python中几种遍历列表的for循环方法. 首先我们先构造一个numbers列表,如下: numbers ...

  8. python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...

    对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...

  9. python同时打开两个文件_在python中使用with打开多个文件的方法

    虽然初恋是java, 可是最近是越来越喜欢python, 所以决定追根溯源好好了解下python的原理,架构等等.小脑袋瓜不太好使,只能记录下慢慢进步吧 使用with打开文件的好处不多说,这里记录一下 ...

最新文章

  1. android屏幕分辨率详解 ldpi mdpi hdpi 程序UI自适应 《官方翻译》
  2. Drop Down Menu
  3. 片上网络NoC(一)—— 概述
  4. ITK:创建Sobel内核
  5. Dubbo的Provider配置
  6. HTTP协议容易犯的误区
  7. 算法复杂度分析(下)
  8. [JavaWeb]web相关概念回顾
  9. 彻底卸载MYSQL,windows版
  10. 波士顿大学计算机专业世界排名,波士顿大学计算机工程专业大学排名业内最独到阐明...
  11. 安卓游戏广告加速插件_从零登顶免费榜榜首 这款头条发行的“特牛”超休闲游戏是如何做到的? | 游戏茶馆...
  12. php网页错误404,php出现404错误页面的解决方法
  13. 前端工程师应该懂的ps基本操作
  14. PHP地图规划骑行路径,规划结果 + 骑行路线绘制
  15. aid learning安装应用_Aid Learning
  16. 电影《寒战2》中的管理知识
  17. 大数据算法工程师知识点大全
  18. Web安全深度剖析第三章读书笔记
  19. 导航背景变换 php,jQuery实现的背景动态变化导航菜单效果
  20. 正则表达式,匹配数字

热门文章

  1. Adobe illustrator 图的放置和微调 - 连载 9
  2. Nature子刊:中科院动物所合作揭示灵长类血管衰老的驱动力
  3. 多元线性回归matlab代码_医学统计|多元线性回归分析
  4. 关于Chrome字体模糊解决方案
  5. Vue 安装 live-server
  6. linux ls命令shell脚本位置,linux - shell脚本到ls并在ls上执行命令结果 - SO中文参考 - www.soinside.com...
  7. Qt文档阅读笔记-void QObject::deleteLater()解析
  8. Java笔记-JdbcTemplate批量执行insert及update
  9. Arduino笔记-Rouch Sensor的使用
  10. Qt工作笔记-QML自定义圆形进度条(C++后端处理数据)