つまりなにしたの?
PythonからRedisを叩いて、Pythonのプログラムから出版したり、購読したりした。
Redisに接続したコネクションから、Publish(channel, message)で出版して
コネクションのpubsubオブジェクトからsubscribe(channel)で購読した。
実行環境
$ 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する
概念図
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する
概念図
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する
概念図
先程までに作った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を介せば何にでもつながるのがむしろ便利だと思う。