EnsekiTT Blog

EnsekiTTが書くブログです。

PythonからRedisを叩いてPub/Subする話

スポンサーリンク

つまりなにしたの?

PythonからRedisを叩いて、Pythonのプログラムから出版したり、購読したりした。
Redisに接続したコネクションから、Publish(channel, message)で出版して
コネクションのpubsubオブジェクトからsubscribe(channel)で購読した。
f:id:ensekitt:20180923030113j:plain

実行環境

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.4 LTS (Xenial Xerus)"
# 省略
$ redis-server --version
Redis server v=4.0.11 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=4bc3aa215ca9cf78
$ redis-cli --version
redis-cli 4.0.11
$ python --version
Python 3.6.6
$ pip freeze | grep redis
redis==2.10.6

PythonからRedisに接続する

PythonからRedisに接続するにはredisパッケージをインストールする。

$ pip install redis

PythonでPublishしてRedis-cliでSubscribeする

概念図
f:id:ensekitt:20180923030147j:plain:w640
Pythonで"hoge"チャンネルに出版するコード(pub.py)

import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
r.publish('hoge', 'hello')

Subscribe側はredis-cliを用いて立ち上げて、hogeを購読しておく

redis-cli
127.0.0.1:6379> subscribe hoge
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "hoge"
3) (integer) 1
1) "message"
2) "hoge"
3) "hello"

Redis-cliでPublishしてPythonでSubscribeする

概念図
f:id:ensekitt:20180923030211j:plain:w640
Pythonで"hoge"チャンネルを購読するコード(sub.py)

import redis

r = redis.StrictRedis(host='localhost', port=6379, db=0)
p = r.pubsub()
p.subscribe('hoge')
for message in p.listen():
    print(message)

p.listen()で待ちの状態になっているので、"hoge"に対してメッセージが来た時に
for文の中身が実行される。

Publish側はredis-cliを用いて立ち上げて、Pythonのコードを実行してから"hoge"に対して出版する

redis-cli
127.0.0.1:6379> PUBLISH hoge world
(integer) 1

PythonでPublishして、PythonでSubscribeする

概念図
f:id:ensekitt:20180923030229j:plain:w640
先程までに作ったpub.pyとsub.pyを実行する。
購読者側が先に立ち上がっていないと実行結果が見られないので、

$ python sub.py &
[1] 1111
{'type': 'subscribe', 'pattern': None, 'channel': b'hoge', 'data': 1}
$ python pub.py
{'type': 'message', 'pattern': None, 'channel': b'hoge', 'data': b'hello'}

$ sudo kill 1111

Pythonのコードのみで配信と購読ができた。

おわりに

今回はPythonでやったけど、別にRedisを介せば何にでもつながるのがむしろ便利だと思う。

参考文献

github.com

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。