【Redis】【Python3】安装Redis服务器并使用Python进行发布/订阅

0. 首先

概略.png

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

99.更新历史

日付変更内容2018/02/08投稿
广告
将在 10 秒后关闭
bannerAds