您的位置:首页 > 数据库 > Redis

Python操作Redis之订阅与发布

2015-10-22 16:08 507 查看
订阅者可以订阅一个或多个频道,发布者向一个频道发送消息后,所有订阅这个频道的订阅者都将收到消息,而发布者也将收到一个数值,这个数值是收到消息的订阅者的数量。订阅者只能收到自它开始订阅后发布者所发布的消息,之前发布的消息呢,就不可能收到了。

下面,先给出订阅端的代码

# coding=utf-8
'''
Created on 2015-9-9

@author: kwsy
'''
import redis
pool=redis.ConnectionPool(host='192.168.1.149',port=6379,db=1)
r = redis.StrictRedis(connection_pool=pool)
p = r.pubsub()
p.subscribe('excelFile')
for item in p.listen():
print item
if item['type'] == 'message':
data =item['data']
r.set('s',32)
print data
if item['data']=='over':
break;
p.unsubscribe('spub')
print '取消订阅'


运行时,要注意检查type,一旦listen,就会收到一个消息,但不是发布者的消息,而是系统发来的,内容为{'pattern': None, 'type': 'subscribe', 'channel': 'spub', 'data': 1L},这个的意思是说,你订阅成功了,频道是spub,当前,有一个订阅用户。

再来看发布端的代码

# coding=utf-8
'''
Created on 2015-9-9

@author: Administrator
'''
import redis
pool=redis.ConnectionPool(host='192.168.1.142',port=6379,db=0)
r = redis.StrictRedis(connection_pool=pool)
while True:
input = raw_input("publish:")
if input == 'over':
print '停止发布'
break;
r.publish('spub', input)
rwa_input接收用户输入的数据发布到频道中,订阅端收到后打印数据

这里有一个小情况要指明,实际运行中,如果你输入的是汉子,那么打印出来的可能是乱码,但其实呢,并不是真的编程乱码了,而是当你采用cmd命令窗口运行时,cmd命令窗口有自己的编码格式,所以才会看着乱码,如果用eclipse运行,就不会这样了。

还有一点要注意,如果你使用Redis-cli,也就是redis的客户端订阅了一个频道,那么订阅后,你无法进行除subscribe,unsubscribe,psubscribe,punsubscribe这四个命令意外的其他任何命令。我在订阅代码中放了一行r.set('s',32),执行过程中,这句话是被执行了的,也就是说,当我们用编程语言操作redis时,订阅后,我们仍然可以使用其他命令,因此,刚才所说的有关命令的限制只是针对redis自己的客户端而言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: