Comment implémenter les notifications d'espace de clés Redis dans ElastiCache ?

Dernière mise à jour : 08/10/2020

Comment implémenter les notifications d'espace de clés Redis dans Amazon ElastiCache ?

Brève description

Les notifications d'espace de clés Redis vous permettent de vous abonner aux canaux PubSub. Via le canal, les clients reçoivent des événements publiés lorsqu'une commande Redis ou une modification de données se produit. Ces notifications sont utiles lorsqu'une application doit répondre à des modifications apportées à la valeur stockée dans une ou plusieurs clés particulières. Vous pouvez également suivre les modifications apportées à l’ensemble de données à l'aide des notifications d'espace de clés Redis. La fonction de notification d'espace de clés est disponible dans les versions 2.8.6 et ultérieures.

Lorsqu'une commande s'exécute et déclenche une notification d'espace de clés Redis, les deux événements suivants se produisent auxquels les clients de surveillance répondent :

  • Notification d'espace de clés
  • Notification d'événements de clés

Le canal d'espace de clés reçoit le nom de l'événement et le canal d'événement de clés reçoit le nom de la clé sous forme de message.

Résolution

Activer la notification d'espace de clés Redis

ElastiCache désactive les notifications d'espace de clés Redis par défaut. Vous pouvez activer les notifications d'espace de clés dans un groupe de paramètres de cache personnalisé à l'aide du paramètre notifier-les-événements-d'espace-de-clés. La valeur notifier-les-événements-d'espace-de-clés prend un certain nombre de paramètres afin de déterminer le type de canal à utiliser (événementsespace de clés ou événements événement d’espace de clés ) et les informations à publier sur ces canaux. Pour plus d'informations, consultez les paramètres ajoutés à Redis 2.8.6.

1.    Ouvrez la console ElastiCache, puis choisissez Groupes de paramètres.

2.    Pour afficher la liste de tous les groupes de paramètres disponibles, choisissez Groupes de paramètres dans le panneau de navigation.

3.    Sélectionnez le groupe de paramètres que vous souhaitez modifier.

Remarque : Vous ne pouvez pas modifier un groupe de paramètres par défaut. Si tous les groupes de paramètres répertoriés sont par défaut, créez un nouveau groupe de paramètres en choisissant Créer un groupe de paramètres, sélectionnez une famille, puis choisissez Créer.

4.    Choisissez Modifier les paramètres.

5.    Faites défiler jusqu'à notifier-les-événements-d'espace-de-clés, puis entrez AKE dans le champ Valeur . Pour plus d'informations sur les valeurs autorisées, consultez les paramètres ajoutés Redis 2.8.6.

6.    Choisissez Enregistrer les modifications. Les modifications prennent effet immédiatement sans redémarrer le cluster.

Générer des événements à l'aide de redis-cli

Si vous utilisez redis-cli, vous pouvez exécuter la commande suivante pour voir comment une commande donnée génère des événements :

#./redis-cli -c -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379 --csv psubscribe '__key*__:*'

Exécutez n'importe quel ensemble de commandes pour créer des événements d'espace de clés. Les commandes suivantes définissent la valeur et le délai d'expiration à 3 secondes pour la clé Redis et l'abonné pour les événements expirés.

./redis-cli -c -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>

Dans une autre session, vérifiez que les événements sont générés. Voici un exemple de sortie des événements :

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

Dans l'exemple de sortie précédent, le premier événement indique que vous avez réussi à vous abonner à un canal. Le nombre «1» représente le nombre de chaînes auxquelles vous abonnez actuellement.

Le deuxième événement est une notification d'espace de clés. Le canal de l'espace clé __keyspace @0__:key1 contient le nom de l'événement «défini» comme un message.

Le troisième événement est une notification d'événement clé . Le canal d'événement clé clé __keyevent @0__:set ; contient le nom de la clé «key1» comme message.

Après 5 secondes, vous pouvez regarder le message expiré dans la sortie. Il y a des différences subtiles dans les messages. Un message est __keyevent @0__:expire alors qu'un autre message est __keyevent @0__:expiré.

Chaque message lu à partir de l'instance PubSub est un dictionnaire avec les clés suivantes :

  • Type - Un des éléments suivants : abonnement, désabonnement, psubscribe, punsubscribe, message, pmessage
  • Modèle - Modèle qui correspond au canal du message publié (à l'exception du type pmessage, qui ne correspond pas dans tous les cas)
  • Canal - Canal vers lequel le message est publié ou canal auquel le message est abonné.
  • Données - Données de message

Générer des événements à l’aide de Redis-py

1.    Abonnez-vous aux notifications. L'exemple suivant s'abonne à toutes les notifications d'espace de clés et imprime les événements reçus.

# 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)

Remarque : des valeurs plus faibles ou l'absence de veille obligent le client à interroger constamment le canal, ce qui risque de surcharger le serveur. Des valeurs plus élevées provoquent une plus grande utilisation de la mémoire côté serveur. L'exemple précédent définit time.sleep sur (0.01).

2.    Définir ou expirer des clés.

Dans une autre session, connectez-vous au cluster et exécutez la commande createkey.py . Définissez la clé key2avec la valeurvalue2et le délai d'expiration est de 3 secondes.

# cat createkey.py
import redis
  r = redis.Redis(host='testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com', port=6379, db=0)
  r.set('key2,’value2’)
  r.expire('key2’,3)

Exécutez la commande subscribe.py dans une autre session. Voici un exemple de sortie :

# python2 subscribe.py

Starting message loop
2020-08-17 18:16:23.902762 {u'pattern': None, u'type': 'psubscribe', u'channel': '__key*__:*', u'data': 1L}
2020-08-17 18:16:50.375281 {u'pattern': '__key*__:*',
    u'type': 'pmessage', u'channel': '__keyspace@0__:key2', u'data': 'set'}
2020-08-17 18:16:50.375365 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:set', u'data': 'key2'}
2020-08-17 18:16:50.375442 {u'pattern': '__key*__:*',
    u'type': 'pmessage', u'channel': '__keyspace@0__:key2', u'data': 'expire'}
2020-08-17 18:16:50.375499 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:expire', u'data': 'key2'}
2020-08-17 18:16:53.458622 {u'pattern':
    '__key*__:*', u'type': 'pmessage', u'channel': '__keyspace@0__:key2', u'data': 'expired'}
2020-08-17 18:16:53.458856 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:expired', u'data': 'key2'}

Votre écouteur d'expiration de clés Redis est prêt.</p


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?