文档章节

python redis 模块 官方文档(中)

xiaoanyunfei
 xiaoanyunfei
发布于 2015/04/29 16:05
字数 1430
阅读 94
收藏 0
点赞 0
评论 0

Publish / Subscribe

redis-py包含一个PubSub对象,来订阅频道和监听消息,创建PubSub对象很简单

>>> r = redis.StrictRedis(...) 
>>> p = r.pubsub()
一旦一个PubSub对象被创建,频道channel和匹配模式(基于正则表达式的channel)就能够订阅了
>>> p.subscribe('my-first-channel', 'my-second-channel', ...) 
>>> p.psubscribe('my-*', ...)
现在PubSub对象可以订阅这些频道了,可以从PubSub对象读取消息来确认是否订阅成功
>>> p.get_message() 
{'pattern': None, 'type': 'subscribe', 'channel': 'my-second-channel', 'data': 1L} 
>>> p.get_message() 
{'pattern': None, 'type': 'subscribe', 'channel': 'my-first-channel', 'data': 2L}
 >>> p.get_message()
 {'pattern': None, 'type': 'psubscribe', 'channel': 'my-*', 'data': 3L}

从PubSub对象读取的消息时一个包含一下键的字典

type:可以是以下值中的一个

 ‘subscribe’, ‘unsubscribe’, ‘psubscribe’, ‘punsubscribe’, ‘message’, ‘pmessage’

channel:订阅或取消订阅的频道或者消息要发送的频道

pattern: 匹配一个信息频道的模式,除了'pmessage'其他情况下都是none

data:消息数据,对于(非)订阅消息,这个值会是当前订阅的channel和匹配模式连接的数量,对于[p]message,这个值就是发送的消息

现在就可以发送消息了

 发送方法返回channel匹配和模型pattern匹配的数量
# 'my-first-channel' 匹配 'my-first-channel' channel订阅和'my-*' pattern订阅
#所以这些消息会被传送给2个channel或pattern
>>> r.publish('my-first-channel', 'some data')
 2 
>>> p.get_message()
 {'channel': 'my-first-channel', 'data': 'some data', 'pattern': None, 'type': 'message'} 
>>> p.get_message() 
{'channel': 'my-first-channel', 'data': 'some data', 'pattern': 'my-*', 'type': 'pmessage'}

对于取消订阅,和订阅一样,如果没有传递参数,会取消所有订阅

>>> p.unsubscribe()
>>> p.punsubscribe('my-*')
>>> p.get_message()
{'channel': 'my-second-channel', 'data': 2L, 'pattern': None, 'type': 'unsubscribe'}
>>> p.get_message()
{'channel': 'my-first-channel', 'data': 1L, 'pattern': None, 'type': 'unsubscribe'}
>>> p.get_message()
{'channel': 'my-*', 'data': 0L, 'pattern': None, 'type': 'punsubscribe'}

redis-py 也允许你注册一个回调功能来控制消息发布.消息控制器只有一个参数,message,就像上面例子一样是一个字典.用消息控制器订阅频道channel或者匹配样式pattern,传送channel或pattern作为关键字参数,值作为回调功能

当使用消息控制器从channel或pattern读取消息时,消息字典被创建并传递给消息控制器.这种情况下,由于消息已经被处理,get_message()返回一个None值

>>> def my_handler(message):
...     print 'MY HANDLER: ', message['data']
>>> p.subscribe(**{'my-channel': my_handler})
# 读取订阅确认信息
>>> p.get_message()
{'pattern': None, 'type': 'subscribe', 'channel': 'my-channel', 'data': 1L}
>>> r.publish('my-channel', 'awesome data')
1
#由于消息控制器的作用,我们需要告诉实例读取数据,可以有多种方式处理,
#这里我们只使用get_message()
>>> message = p.get_message()
MY HANDLER:  awesome data
#注意这里my_handler回调打印了上面的字符串 
# `message`是 None 因为消息被控制器控制了
>>> print message
None

如果你的应用不关心订阅/取消订阅确认消息(有时候是噪音),你可以传一个 ignore_subscribe_messages=True给 r.pubsub().这会引起所有的订阅非订阅消息读取,但不会出现在你的应用中

>>> p = r.pubsub(ignore_subscribe_messages=True)
>>> p.subscribe('my-channel')
>>> p.get_message() 
 #隐藏了订阅消息,返回None
 >>> r.publish('my-channel')
 1
 >>> p.get_message()
 {'channel': 'my-channel', data': 'my data', 'pattern': None, 'type': 'message'}

有三种不同的读取消息的策略

上面的例子使用pubsub.get_message().在这种场景,get_message()使用系统的'select'模式快速测试连接的socket.如果有数据可以被读取,get_message()会读取它,处理后返回或者传递给消息处理器.如果没有数据读取,get_message()会立刻返回None.这使得整合到你的应用中一个已存的事件循环并不重要

>>> while True:
>>>     message = p.get_message()
>>>     if message:
>>>        # do something with the message
>>>     time.sleep(0.001)  # be nice to the system :)

redis-py更老的版本只能用 pubsub.listen()读取消息,listen()是一个生成器,会阻塞直到有消息可以获得.如果你的应用不需要做任何事除了从redis接收消息,并对消息做出反应,listen()是一个简单的运行方式

>>> for message in p.listen():...     # do something with the message

第三种选择是在单独的线程里运行一个事件循环, pubsub.run_in_thread() 创建一个新的线程并启动事件循环.线程对象被返回给调用者run_in_thread().调用者可以使用 thread.stop() 来关闭事件循环和线程.在这种场景下,运行线程的只是一个简单的对get_message()的包装器,尤其是你创建一个小的非阻塞的事件循环. run_in_thread() 有一个可选择的 sleep_time参数.如果被指定,事件循环会在每次循环迭代时用指定的值调用time.sleep()

注意,由于我们运行了一个单独的线程,没有办法控制不是由注册的消息控制器自动控制的消息.因此,如果你正在订阅没有消息控制器关联的pattern或channel,redis-p会阻止你调用 run_in_thread()

>>> p.subscribe(**{'my-channel': my_handler})
>>> thread = p.run_in_thread(sleep_time=0.001)
# 现在事件循环在后台运行处理消息
# 当要关闭该线程时
>>> thread.stop()

一个PubSub对象绑定到同样编码的语义作为它创建的客户端实例.任何采用unicode的pattern和channel在发给Redis之前会被编码为指定的字符集.如果客户端的解码flag decode_responses被设定为False(默认值),消息字典中的 ‘channel’, ‘pattern’ 和 ‘data’会变成byte字符串((Python 2时str,  Python 3时byte).如果客户端decode_responses 是True,‘channel’, ‘pattern’ 和 ‘data’值会使用客户端的字符集自动解码为unicode字符

PubSub对象保存了他们订阅的channel和pattern.在无法连接的事件中,如网络错误或超时,当重新连接时PubSub对象会重新订阅所有的先前的channel和pattern.无法连接期间发布的消息无法再呈现.当你要结束一个PubSub对象时,调用close()方法关闭连接

>>> p = r.pubsub()
>>> ...
>>> p.close()

Redis官方文档https://pypi.python.org/pypi/redis/

© 著作权归作者所有

共有 人打赏支持
xiaoanyunfei
粉丝 0
博文 12
码字总数 11094
作品 0
海淀
Python学习你掌握对方法了吗?python自动化

阅读官方文档即可满足日常需求,官方文档有中文翻译,更加方便学习。但这些都是基础的语法和常见的模块,Python学习重要的是模块,快速、高效的开发依赖的是模块的应用,站在前人的肩膀会省时...

老男孩Linux培训 ⋅ 06/12 ⋅ 0

156个Python网络爬虫资源,妈妈再也不用担心你找不到资源了

本列表包含Python网页抓取和数据处理相关的库。 前几天有私信小编要Python的学习资料,小编整理了一些有深度的Python教程和参考资料,从入门到高级的都有,文件已经打包好了,正在学习Pytho...

雁横 ⋅ 05/02 ⋅ 0

python开源工具列表【持续更新】

以下是个人在工作中整理的一些python wheel,供参考。 这个列表包含与网页抓取和数据处理的Python库 网络 通用urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库(基于pycurl)。...

武耀文 ⋅ 04/25 ⋅ 0

python-35:urllib 和 urllib2 模块

首先,urllib 和 urllib2 是python 自带的模块,所以我们可以通过官网文档来查看它们的详细信息,这里依然给出网址,感兴趣的同学可以看一下 urllib模块:http://python.usyiyi.cn/python278...

达岭凹老大 ⋅ 2015/12/01 ⋅ 0

C/C++ 和 Python混合编程

链接:https://www.zhihu.com/question/23003213/answer/56121859 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 #include int main(int argc, char *...

sirius_0 ⋅ 04/21 ⋅ 0

Python 模块的设计和编写

简述 在 Python 中,模块是由 Python 代码组成的 文件,任何 Python 文件都可以作为一个模块被引用。 编写模块就像编写任何其他 Python 文件一样,模块可以包含类、函数和变量的定义,然后在...

潘志闻 ⋅ 2017/07/13 ⋅ 0

大数据分析挖掘学习方向?数据分析师的就业前景怎么样?

加米谷数据分析挖掘课程明细,从理论到云端实操环境到项目实战,手把手教您从0掌握数据分析与挖掘技术,带您走进数据时代。 第一阶段(python基础) python入门:1、Python版本特性介绍2、P...

加米谷大数据 ⋅ 04/17 ⋅ 0

django 1.8 官方文档翻译: 3-5-1 使用Django输出CSV

使用Django输出CSV 这篇文档阐述了如何通过使用Django视图动态输出CSV (Comma Separated Values)。 你可以使用Python CSV 库或者Django的模板系统来达到目的。 使用Python CSV库 Python自带了...

apachecn_飞龙 ⋅ 2015/09/04 ⋅ 0

老司机工作总结!零基础python小白学习编程一定要知道的那些技巧

今天又是一年一度的关键时刻:高考了。高考可谓是牵动着无数普通家庭的心。但是高考就是千军万马过独木桥,是一场没有硝烟的战争,有输有赢。可是高考跟战争不一样的是,高考就算失败也会有其...

Python学习 ⋅ 06/07 ⋅ 0

Python中os与sys两模块的区别

前言 os与sys模块的官方解释如下: os: This module provides a portable way of using operating system dependent functionality. 这个模块提供了一种方便的使用操作系统函数的方法。 sys:...

xiaoge2016 ⋅ 04/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 57分钟前 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 7

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部