Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
ElastiCache に Redis キースペース通知を実装する方法を教えてください。
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 で追加されたパラメータ」を参照してください。
- ElastiCache コンソールを開きます。
- 使用可能なパラメータグループのリストを表示するには、ナビゲーションペインで [パラメータグループ] を選択します。
- リストから、変更するパラメータグループを選択します。
**注:**デフォルトのパラメータグループを変更することはできません。リストされているすべてのパラメータグループがデフォルトの場合は、新しいパラメータグループを作成します。 - (オプション) 新しいパラメータグループを作成するには、「パラメータグループの作成」を選択します。
[名前] フィールドに、一意の名前を入力します。
[説明] フィールドに説明を入力します。
[ファミリ] を選択します。
[作成] を選択します。 - [パラメータ値の編集] を選択します。
- notify-keyspace-events に移動し、[値] フィールドに AKE と入力します。許容値の詳細については、「Redis 2.8.6 で追加されたパラメータ」を参照してください。
- [変更を保存] を選択します。変更はすぐに有効になり、クラスターを再起動する必要はありません。
**注:**必ず、新しく変更したパラメータグループを Redis クラスターに割り当ててください。
イベントを生成
イベントを生成するには、Redis コマンドラインインターフェイス (CLI) または Redis Python クライアントのいずれかを使用します。
Redis CLI (redis-cli) を使用する
-
通知をサブスクライブするには、redis-cli を使用して次のコマンドを実行します。
#./redis-cli -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379 --csv psubscribe '__key*__:*'
-
キースペースイベントを作成するには、任意のコマンドセットを実行します。次のコマンド例では、キーの 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>
-
イベントが生成されることを確認します。以下は、生成されたイベントの出力例です。
#./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) を使う
-
通知をサブスクライブするには、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.sleep を 0.01 に設定しています。
-
別のセッションでクラスターに接続し、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)
-
別のセッションで 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 キーリスナーが準備完了です。
関連するコンテンツ
- 質問済み 4年前lg...
- 質問済み 7年前lg...