ElastiCache に Redis キースペース通知を実装する方法を教えてください。

所要時間2分
0

Amazon ElastiCache に Redis キースペース通知を実装したいと考えています。

簡単な説明

Redis キースペース通知により、PubSub チャネルに登録できます。これらのチャネルを通じて、Redis コマンドまたはデータ変更が発生したときに、公開されたイベントが受信されます。これらの通知は、特定のキーに格納されている値に生じた変更にアプリケーションが応答する必要がある場合に役立ちます。また、Redis キースペース通知を使用してデータセットの変更を追跡することもできます。キースペース通知機能はバージョン 2.8.6 以降で使用できます。Redis キースペース通知が呼び出されると、キースペース通知とキーイベント通知が発生します。キースペースチャネルはイベントの名前を受け取り、キーイベントチャネルはキーの名前をメッセージとして受け取ります。

解決策

注: 次の解決策は、クラスターモードが無効になっている ElastiCache クラスターに適用されます。詳しくは、Redis ウェブサイトの「Redis キースペース通知」を参照してください。

Redis キースペース通知を ElastiCache に実装するには、以下の手順を実行します。

Redis キースペース通知を有効にする

注: デフォルトでは、ElastiCache では Redis のキースペース通知は無効です。カスタムキャッシュのパラメータグループでキースペース通知を有効にするには、notify-keyspace-events パラメータを使用します。このパラメータ値では複数のパラメータを使用して、使用するチャネル (keyspace または key-event) および、チャネルに送信する情報を決定します。詳細については、「Redis 2.8.6 で追加されたパラメータ」を参照してください。

  1. ElastiCache コンソールを開きます。
  2. 使用可能なパラメータグループのリストを表示するには、ナビゲーションペインで [パラメータグループ] を選択します。
  3. リストから、変更するパラメータグループを選択します。
    **注:**デフォルトのパラメータグループを変更することはできません。リストされているすべてのパラメータグループがデフォルトの場合は、新しいパラメータグループを作成します。
  4. (オプション) 新しいパラメータグループを作成するには、「パラメータグループの作成」を選択します。
    [名前] フィールドに、一意の名前を入力します。
    [説明] フィールドに説明を入力します。
    [ファミリ] を選択します。
    [作成] を選択します。
  5. [パラメータ値の編集] を選択します。
  6. notify-keyspace-events に移動し、[値] フィールドに AKE と入力します。許容値の詳細については、「Redis 2.8.6 で追加されたパラメータ」を参照してください。
  7. [変更を保存] を選択します。変更はすぐに有効になり、クラスターを再起動する必要はありません。
    **注:**必ず、新しく変更したパラメータグループを Redis クラスターに割り当ててください。

イベントを生成

イベントを生成するには、Redis コマンドラインインターフェイス (CLI) または Redis Python クライアントのいずれかを使用します。

Redis CLI (redis-cli) を使用する

  1. 通知をサブスクライブするには、redis-cli を使用して次のコマンドを実行します。

    #./redis-cli -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379 --csv psubscribe '__key*__:*'
  2. キースペースイベントを作成するには、任意のコマンドセットを実行します。次のコマンド例では、キーの Redis の値と有効期限を 3 秒に設定し、期限切れイベントのサブスクライバーを設定します。

    #./redis-cli -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379
    testdisabled.xm4oz6.ng.0001.use1.cache.amazonaws.com:6379>
    testdisabled.xm4oz6.ng.0001.use1.cache.amazonaws.com:6379> SET key1 value1 ex 5
    testdisabled.xm4oz6.ng.0001.use1.cache.amazonaws.com:6379>
  3. イベントが生成されることを確認します。以下は、生成されたイベントの出力例です。

    #./redis-cli -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379 --csv psubscribe '__key*__:*'
    Reading messages... (press Ctrl-C to quit)
    "psubscribe","__key*__:*",1
    "pmessage","__key*__:*","__keyspace@0__:key1","set"
    "pmessage","__key*__:*","__keyevent@0__:set","key1"
    "pmessage","__key*__:*","__keyspace@0__:key1","expire"
    "pmessage","__key*__:*","__keyevent@0__:expire","key1"
    "pmessage","__key*__:*","__keyspace@0__:key1","expired"
    "pmessage","__key*__:*","__keyevent@0__:expired","key1"

    前述の出力例では、最初のイベントは ** 1 ** つのチャネルに正常にサブスクライブされたことを示しています。2 番目のイベントは、メッセージとして設定されたイベント名を示すキースペース通知です。3 番目のイベントは、キー名 key1 をメッセージとして示すキーイベント通知です。3 番目のイベントの後、キースペースの有効期限メッセージとキーイベント通知が表示されます。

Redis Python クライアント (redis-py) を使う

  1. 通知をサブスクライブするには、Python 2 または Python 3 スクリプトを使用してください。
    注: 次のスクリプトでは、すべてのキースペース通知にサブスクライブし、受信したイベントを出力します。
    Python 2:

    # cat subscribe.py
    import redis
    import datetime
    import time
    r = redis.Redis(host='testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com', port=6379, db=0)
    #Subscribing for events matching pattern "__key*__:*"
    p = r.pubsub()
    p.psubscribe('__key*__:*')
    print('Starting message loop')
    while True:
        message = p.get_message()
        if message:
            print datetime.datetime.now(), message
        else:
            time.sleep(0.01)

    Python 3:

    import redis
    from datetime import datetime
    import time
    r = redis.Redis(host = 'testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com', port = 6379, db = 0)
    #Subscribing for events matching pattern "__key*__:*
    p = r.pubsub()
    p.psubscribe('__key*__:*')
    print('Starting message loop')
    while True:
        message = p.get_message()
        if message:
            print (datetime.now(), message)
        else:
            time.sleep(0.01)

    **注:**値が低い場合やスリープがないためにクライアントがチャネルを継続的にポーリングする場合、サーバーの過負荷が発生する可能性があります。値が大きいほど、サーバーのメモリ使用量が増加します。前述のスクリプトは time.sleep0.01 に設定しています。

  2. 別のセッションでクラスターに接続し、createkey.py スクリプトを実行してキーを設定または期限切れにします。
    **注:**必ず example-key をキーに設定し、example-value を値として設定してください。また、有効期限には 3 秒の値を使用してください。

    # cat createkey.py
    import redis
    r = redis.Redis(host='testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com', port=6379, db=0)
    r.set('example-key','example-value')
    r.expire('example-key',3)
  3. 別のセッションで subscribe.py スクリプトを実行します。
    出力例:

    # python2 subscribe.py
    Starting message loop
    2024-04-29 23:40:56.356659 {u'pattern': None, u'type': 'psubscribe', u'channel': '__key*__:*', u'data': 1L}
    2024-04-29 23:40:56.356659 {u'pattern': None, u'type': 'psubscribe', u'channel': '__key*__:*', u'data': 1L}
    2024-04-29 23:41:00.016410 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyspace@0__:example-key', u'data': 'set'}
    2024-04-29 23:41:00.016512 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:set', u'data': 'example-key'}
    2024-04-29 23:41:00.016582 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyspace@0__:example-key', u'data': 'expire'}
    2024-04-29 23:41:00.016650 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:expire', u'data': 'example-key'}
    2024-04-29 23:41:03.111509 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyspace@0__:example-key', u'data': 'expired'}
    2024-04-29 23:41:03.111601 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:expired', u'data': 'example-key'}

    **注:**上記のコマンドを完了すると、Redis キーリスナーが準備完了です。

コメントはありません

関連するコンテンツ