天天看点

【Python之旅】第七篇(三):使用Redis订阅服务

 在c/s架构中,可以充分地利用redis订阅服务,实现服务器端和客户端的信息收发,下面说说在python中如何使用redistribute的订阅服务。

    这里要举的例子是,server端进行服务的订阅,而client端进行消息的广播发送。

1.方法一:server端使用redis操作+client端使用python交互器

(1)server端

    进入redis操作界面:

1

2

<code>xpleaf@xpleaf-machine:/mnt/hgfs/python/day7/redis-</code><code>2.8</code><code>.</code><code>9</code><code>/src$ redis-cli</code>

<code>127.0</code><code>.</code><code>0.1</code><code>:</code><code>6379</code><code>&gt;</code>

    开始监听频道chan_107:

3

4

5

<code>127.0</code><code>.</code><code>0.1</code><code>:</code><code>6379</code><code>&gt; subscribe chan_107</code>

<code>reading messages... (press ctrl-c to quit)</code>

<code>1</code><code>) </code><code>"subscribe"</code>

<code>2</code><code>) </code><code>"chan_107"</code>

<code>3</code><code>) (integer) </code><code>1</code>

(2)client端

    创建redis_connector.py文件,用以连接server端redis:

<code>#!/usr/bin/env python</code>

<code>import</code> <code>redis</code>

<code>r = redis.redis(host=</code><code>'192.168.1.112'</code><code>,port=</code><code>6379</code><code>,db=</code><code>0</code><code>)</code>

    在python交互器中导入redis_connector,并发布消息:

<code>&gt;&gt;&gt; redis.r.publish(</code><code>'chan_107'</code><code>,</code><code>'hello my name is xpleaf'</code><code>)</code>

<code>1l</code>

    此时在server端中就能看到client端发布的消息了:

6

7

8

<code>1</code><code>) </code><code>"message"</code>

<code>3</code><code>) </code><code>"hello my name is xpleaf"</code>

2.方法二:server端使用python程序+client端使用python交互器

    程序代码如下:

9

10

<code>import</code> <code>redis_connector </code><code>as</code> <code>redis</code>

<code>channel = </code><code>'chan_107'</code>    <code>#频道应该要和发布者的一样,否则将无法订阅到发布者发布的消息</code>

<code>msg_queue = redis.r.pubsub() #bind listen instance</code>

<code>msg_queue.subscribe(channel)</code>

<code>while</code> <code>true:</code>

<code>    </code><code>data = msg_queue.parse_response() #waiting </code><code>for</code> <code>the publisher</code>

<code>    </code><code>print data</code>

    可以看到这里也导入了redis_connector模块用来连接本地的redis数据库,跟client端的类似,只是ip地址改为'localhost',如下:

<code>r = redis.redis(host=</code><code>'localhost'</code><code>,port=</code><code>6379</code><code>,db=</code><code>0</code><code>)</code>

    msg_queue.parse_response()即是用来响应client端发布的消息,执行该程序,开始监听消息:

<code>xpleaf@xpleaf-machine:/mnt/hgfs/python/day7/monitor/m_server/core$ python redis_sub.py </code>

<code>===&gt;光标停在此处,开始监听client端发布的消息</code>

    创建redis_connector.py文件,用以连接server端redis:

<code>&gt;&gt;&gt; redis.r.publish(</code><code>'chan_107'</code><code>,</code><code>'hello my name is yonghaoye'</code><code>)</code>

<code>2l</code>

<code>&gt;&gt;&gt; redis.r.publish(</code><code>'chan_107'</code><code>,</code><code>'second msg'</code><code>)</code>

    上面两步其实和方法一是一样的。

    此时在server端中也可以订阅到client端发布的消息了:

<code>[</code><code>'message'</code><code>, </code><code>'chan_107'</code><code>, </code><code>'hello my name is yonghaoye'</code><code>]</code>

<code>[</code><code>'message'</code><code>, </code><code>'chan_107'</code><code>, </code><code>'second msg'</code><code>]</code>

<code>===&gt;光标停在此处,继续监听client端发布的消息</code>

3.方法三:server端使用python程序+client端使用python程序

    直接给出client端的程序代码:

<code>for</code> <code>i </code><code>in</code> <code>range(</code><code>10</code><code>):</code>

<code>        </code><code>redis.r.publish(</code><code>'chan_107'</code><code>,</code><code>'this is the no.%s msg i send to you'</code> <code>% i)</code>

    server端开始监听:

<code>xpleaf@xpleaf-machine:/mnt/hgfs/python/day7/monitor/m_server/core$ python redis_sub.py</code>

    client端发布消息:

<code>[root@moban ~]# python publish.py</code>

    在server端中很快就可以监听到client端发布的消息:

11

<code>[</code><code>'message'</code><code>, </code><code>'chan_107'</code><code>, </code><code>'this is the no.0 msg i send to you'</code><code>]</code>

<code>[</code><code>'message'</code><code>, </code><code>'chan_107'</code><code>, </code><code>'this is the no.1 msg i send to you'</code><code>]</code>

<code>[</code><code>'message'</code><code>, </code><code>'chan_107'</code><code>, </code><code>'this is the no.2 msg i send to you'</code><code>]</code>

<code>[</code><code>'message'</code><code>, </code><code>'chan_107'</code><code>, </code><code>'this is the no.3 msg i send to you'</code><code>]</code>

<code>[</code><code>'message'</code><code>, </code><code>'chan_107'</code><code>, </code><code>'this is the no.4 msg i send to you'</code><code>]</code>

<code>[</code><code>'message'</code><code>, </code><code>'chan_107'</code><code>, </code><code>'this is the no.5 msg i send to you'</code><code>]</code>

<code>[</code><code>'message'</code><code>, </code><code>'chan_107'</code><code>, </code><code>'this is the no.6 msg i send to you'</code><code>]</code>

<code>[</code><code>'message'</code><code>, </code><code>'chan_107'</code><code>, </code><code>'this is the no.7 msg i send to you'</code><code>]</code>

<code>[</code><code>'message'</code><code>, </code><code>'chan_107'</code><code>, </code><code>'this is the no.8 msg i send to you'</code><code>]</code>

<code>[</code><code>'message'</code><code>, </code><code>'chan_107'</code><code>, </code><code>'this is the no.9 msg i send to you'</code><code>]</code>