【Redis】【Python3】安装Redis服务器并使用Python进行发布/订阅
0. 首先
1. 安装
安装
可以使用以下命令进行安装。
$ sudo apt-get update
$ sudo apt-get install redis-server
确定动作
请确认服务器的版本。
$ redis-server -v
确认客户端的版本
$ redis-cli -v
发布/订阅
安装Redis-py
下面是一个使用Python处理Redis的示例,但需要安装Redis-py库才能运行。
$ pip3 install redis
发布
publish是将消息投放到指定频道的操作。
参考→https://redis.io/commands/publish
$ redis-cli
> publish channel message
当然,频道和消息是可以自由设置的。
在这里发送的消息不会被保存在数据库中。
以下是用Python执行此操作的示例。
import redis
import time
host = 'localhost'
port = 6379
def run_publish(loopCount):
# redisに接続
connect = redis.StrictRedis(host=host, port=port)
for i in range(loopCount):
# publish
connect.publish('publish', 'xxxxx')
time.sleep(1)
if __name__ == '__main__':
run_publish(10)
在publish()函数的第一个参数中指定要发送的频道,并在第二个参数中指定消息。
它所做的就是发送以下命令10次。
> publish publish xxxxx
订阅
subscribe指令用于获取发送到指定频道的消息操作。
参考网址→https://redis.io/commands/subscribe
$ redis-cli
> subscribe channel
在开始监视之前,无法获取已发送的消息。
如果在通道之后指定其他通道,可以同时监视多个通道。
以下是监视两个通道channel01和channel02的示例。
$ redis-cli
> subscribe channel01 channel02
如果我尝试在观察中的频道上发布一条消息,我就可以确认是否能收到消息。
(下面是收到的消息的三行)
$ redis-cli
> subscribe channel01
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel01"
3) (integer) 1
1) "message"
2) "channel01"
3) "test_message"
以下是用Python进行的示例。
import redis
host = 'localhost'
port = 6379
def run_subscribe():
# redisに接続
connect = redis.StrictRedis(host=host, port=port)
# Pubsubオブジェクト生成
pubsub = connect.pubsub()
# subscribe開始
pubsub.subscribe(['subscribe'])
for item in pubsub.listen():
print(item)
# 値が"end"ならばsubscribeを終了させる
# channel、dataはbyte列な場合があるので必要に応じてデコードする
data = item.get('data')
if isinstance(data, bytes):
data = data.decode('utf-8')
if data == 'end':
# subscribe終了
pubsub.unsubscribe()
break
if __name__ == '__main__':
run_subscribe()
通过subscribe()函数的参数指定要监视的频道。
这个示例的要点是对接收到的消息进行解码。
如果不这样做,将无法正确处理消息,并且无法实现预期的操作。
(以示例为例,脚本将不会结束)
在完成subscribe后,不要忘记调用unsubscribe()函数来结束监视。
请订阅
如果监视的频道太多,指定频道会变得麻烦。
还有一种可以用模式匹配来指定监视目标频道的命令可供使用。
参考链接→https://redis.io/commands/psubscribe
$ redis-cli
> psubscribe pattern
由于可以指定模式,因此可以监视发送的所有消息。
(对于测试是否发送了额外消息非常方便)
$ redis-cli
> psubscribe *
当然,也可以在Python中使用。(但我个人不建议这样做,因为它可能会捕捉到多余的通道并导致故障)
import redis
host = 'localhost'
port = 6379
def run_psubscribe():
# redisに接続
connect = redis.StrictRedis(host=host, port=port)
# Pubsubオブジェクト生成
pubsub = connect.pubsub()
# psubscribe開始
pubsub.psubscribe(['*'])
for item in pubsub.listen():
print(item)
# 値が"end"ならばpsubscribeを終了させる
# channel、dataはbyte列な場合があるので必要に応じてデコードする
data = item.get('data')
if isinstance(data, bytes):
data = data.decode('utf-8')
if data == 'end':
# psubscribe終了
pubsub.punsubscribe()
break
if __name__ == '__main__':
run_psubscribe()
3. 最后
发布/订阅机制在实现简单通信时非常方便有效。(因为它可以简单地实现,并且可以轻松地查看通信内容。)
98. 查阅
在Python中处理Redis(redis-py的基本知识)- http://www.denzow.me/entry/2017/10/07/233233
【技巧】 使用Python的Redis(8)〜PUB / SUB〜- http://mocobeta-backup.tumblr.com/post/81758811694/tips-python-%E3%81%8B%E3%82%89-redis-%E3%82%92%E4%BD%BF%E3%81%86-8-pubsub
redis-py – https://github.com/andymccurdy/redis-py
命令参考 – Redis – https://redis.io/commands