Python中使用Redis的批处理工具pipeline(这种方法从底层思考效率还是低于“订阅发布机制”)
一、pipeline出现的原因
1.Redis执行命令的过程
redis客户端执行一条命令的过程:
发送命令-〉命令排队-〉命令执行-〉返回结果
使用python给redis发送命令时的过程:
- 客户端发送请求,获取socket,阻塞等待返回;
- 服务端执行命令并将结果返回给客户端;
2.效率提升
当redis需要执行的命令较多时,这样的一来一回的网络传输所消耗的时间被称为RTT(Round Trip Time),显而易见,如果可以将这些命令作为一个请求一次性发送给服务端,并一次性将结果返回客户端,会节约很多网络传输的消耗,可以大大提升响应时间。因此我们python中通过pipeline来进行效率提升。
二、pepeline的性能
1、未使用pipeline执行N条命令
2、使用了pipeline执行N条命令
两种方式中:使用Pipeline执行速度比逐条执行要快,特别是客户端与服务端的网络延迟越大,性能体能越明显。
三、原生批命令与Pipeline对比
- 原生批命令是原子性,pipeline是非原子性(原子性概念:一个事务是一个不可分割的最小工作单位,要么都成功要么都失败)
- 原生批命令一命令多个key, 但pipeline支持多命令(存在事务),非原子性
- 原生批命令是服务端实现,而pipeline需要服务端与客户端共同完成
四、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
5.pipeline配合事务的操作
默认pipeline中支持事务,若想关闭事务,则创建pipeline的时候:
pipe = r.pipeline(transaction=False)
错误总结
①开启事务时候命令出错
# 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(这种方法从底层思考效率还是低于“订阅发布机制”)相关推荐
- python图片-Python中的十大图像处理工具
原标题:Python中的十大图像处理工具 导读:本文主要介绍了一些简单易懂最常用的Python图像处理库. 作者:Parul Pandey 来源:大数据文摘(ID:BigDataDigest) 当今世 ...
- python中异常好用的工具
[TOC] python中异常好用的工具 PrettyErrors 安装 它的安装特别的简单,直接pip就可以 pip install pretty_errors #没有安装pip的,可以采用下面的方 ...
- Python redis的订阅发布机制(publish、pubsub)
为什么用订阅发布机制?原因在于它的速度要比pop.push快很多. 先介绍一下redis的pub/sub功能: Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能. ...
- python中用于释放类占用的资源的方法是()_mooc大学英语词汇期末答案
把两个已有项目放到一起,就是一个新项目,这种项目来源属于(?? ) 答:整合 辩证法同形而上学的斗争 答:是从属于唯物主义同唯心主义的斗争,并同这种斗争交织在一起的 中国大学MOOC: 广义的计划是对 ...
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- python中常见的三种选择结构_在Python中,实现多分支选择结构的最佳方法是
在Python中,实现多分支选择结构的最佳方法是 答:if-elif-else 绘制建筑平面图时,被剖切的墙用 线绘制,定位轴线用 线绘制 答:粗实 细点画 智慧职教: 下列关于书写住院病历的叙述不正 ...
- 介绍python中几种遍历列表的for循环方法
我们在使用列表的过程中,经常需要遍历列表的所有元素,对每个元素执行相同的操作.今天就给大家介绍python中几种遍历列表的for循环方法. 首先我们先构造一个numbers列表,如下: numbers ...
- python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...
对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...
- python同时打开两个文件_在python中使用with打开多个文件的方法
虽然初恋是java, 可是最近是越来越喜欢python, 所以决定追根溯源好好了解下python的原理,架构等等.小脑袋瓜不太好使,只能记录下慢慢进步吧 使用with打开文件的好处不多说,这里记录一下 ...
最新文章
- android屏幕分辨率详解 ldpi mdpi hdpi 程序UI自适应 《官方翻译》
- Drop Down Menu
- 片上网络NoC(一)—— 概述
- ITK:创建Sobel内核
- Dubbo的Provider配置
- HTTP协议容易犯的误区
- 算法复杂度分析(下)
- [JavaWeb]web相关概念回顾
- 彻底卸载MYSQL,windows版
- 波士顿大学计算机专业世界排名,波士顿大学计算机工程专业大学排名业内最独到阐明...
- 安卓游戏广告加速插件_从零登顶免费榜榜首 这款头条发行的“特牛”超休闲游戏是如何做到的? | 游戏茶馆...
- php网页错误404,php出现404错误页面的解决方法
- 前端工程师应该懂的ps基本操作
- PHP地图规划骑行路径,规划结果 + 骑行路线绘制
- aid learning安装应用_Aid Learning
- 电影《寒战2》中的管理知识
- 大数据算法工程师知识点大全
- Web安全深度剖析第三章读书笔记
- 导航背景变换 php,jQuery实现的背景动态变化导航菜单效果
- 正则表达式,匹配数字
热门文章
- Adobe illustrator 图的放置和微调 - 连载 9
- Nature子刊:中科院动物所合作揭示灵长类血管衰老的驱动力
- 多元线性回归matlab代码_医学统计|多元线性回归分析
- 关于Chrome字体模糊解决方案
- Vue 安装 live-server
- linux ls命令shell脚本位置,linux - shell脚本到ls并在ls上执行命令结果 - SO中文参考 - www.soinside.com...
- Qt文档阅读笔记-void QObject::deleteLater()解析
- Java笔记-JdbcTemplate批量执行insert及update
- Arduino笔记-Rouch Sensor的使用
- Qt工作笔记-QML自定义圆形进度条(C++后端处理数据)