Maison  >  Article  >  base de données  >  Comment SpringBoot surveille les événements de changement de clé Redis

Comment SpringBoot surveille les événements de changement de clé Redis

PHPz
PHPzavant
2023-05-26 13:55:262254parcourir

1. Présentation de la fonction

La notification Keyspace permet au client de recevoir des événements qui modifient la clé Redis d'une manière ou d'une autre en s'abonnant au canal ou au mode.

Toutes les commandes pour modifier les touches clés.

Toutes les clés qui reçoivent la commande LPUSH key value [value …].

Toutes les clés expirées dans la base de données db.

Les événements sont distribués via les fonctions d'abonnement et de publication (pub/sub) de Redis, de sorte que tous les clients qui prennent en charge les fonctions d'abonnement et de publication peuvent directement utiliser la fonction de notification keyspace sans apporter aucune modification.

Étant donné que les fonctions actuelles d'abonnement et de publication de Redis adoptent une stratégie de feu et d'oubli, si votre programme nécessite une notification fiable des événements, alors la notification actuelle de l'espace clé peut ne pas vous convenir : lorsqu'un client abonné aux événements se déconnecte. perd tous les événements qui lui sont distribués lors de la déconnexion.

À l'avenir, une distribution d'événements plus fiable sera prise en charge. Cette prise en charge peut être obtenue en rendant les fonctions d'abonnement et de publication elles-mêmes plus fiables, ou en surveillant l'abonnement et la publication de messages dans des scripts Lua. Cela permet des opérations telles que pousser des événements. une liste.

2. Types d'événements

Pour chaque opération qui modifie la base de données, les notifications keyspace enverront deux types d'événements différents.

Par exemple, lors de l'exécution de la commande DEL key [key …] sur la clé mykey de la base de données numérotée 0, le système va distribuer deux messages, équivalent à exécuter les deux commandes PUBLISH canal message suivantes : 0 号数据库的键 mykey 执行 DEL key [key …]命令时, 系统将分发两条消息, 相当于执行以下两个 PUBLISH channel message 命令:

PUBLISH __keyspace@0__:mykey del
PUBLISH __keyevent@0__:del mykey

订阅第一个频道 __keyspace@0__:mykey 可以接收 0 号数据库中所有修改键 mykey 的事件, 而订阅第二个频道 __keyevent@0__:del则可以接收 0 号数据库中所有执行 del 命令的键。

以 keyspace 为前缀的频道被称为键空间通知(key-space notification), 而以 keyevent 为前缀的频道则被称为键事件通知(key-event notification)。

当 del mykey 命令执行时:

  • 键空间频道的订阅者将接收到被执行的事件的名字,在这个例子中,就是 del 。

  • 键事件频道的订阅者将接收到被执行事件的键的名字,在这个例子中,就是 mykey 。

三、配置

因为开启键空间通知功能需要消耗一些 CPU , 所以在默认配置下, 该功能处于关闭状态。

可以通过修改 redis.conf 文件, 或者直接使用 CONFIG SET 命令来开启或关闭键空间通知功能:

当 notify-keyspace-events 选项的参数为空字符串时,功能关闭。

另一方面,当参数不是空字符串时,功能开启。

notify-keyspace-events 的参数可以是以下字符的任意组合, 它指定了服务器该发送哪些类型的通知:

Comment SpringBoot surveille les événements de changement de clé Redis

输入的参数中至少要有一个 K或者 E , 否则的话, 不管其余的参数是什么, 都不会有任何通知被分发。

举个例子, 如果只想订阅键空间中和列表相关的通知, 那么参数就应该设为 Kl , 诸如此类。

将参数设为字符串"AKE" 表示发送所有类型的通知。

每当一个键因为过期而被删除时,产生一个 expired 通知。

每当一个键因为maxmemory政策而被删除以回收内存时,产生一个 evicted 通知。

所有命令都只在键真的被改动了之后,才会产生通知。

比如说,当 SREM key member [member …]

config set notify-keyspace-events KEA

S'abonner au premier canal __keyspace@0__:mykey peut recevoir les événements de toutes les clés modifiées mykey dans la base de données n°0, et abonnement au deuxième canal Un canal __keyevent@0__:del peut recevoir toutes les clés qui exécutent la commande del dans la base de données n°0.

Les canaux préfixés par keyspace sont appelés notifications d'espace clé, et les canaux préfixés par keyevent sont appelés notifications d'événement clé.

Lorsque la commande del mykey est exécutée :
  • Les abonnés au canal keyspace recevront le nom de l'événement qui a été exécuté, dans ce cas, del .

  • Les abonnés au canal d'événement clé recevront le nom de la clé sur laquelle l'événement a été exécuté, dans ce cas, mykey .

3. Configuration

Étant donné que l'activation de la fonction de notification de l'espace clé nécessite du processeur, donc dans la configuration par défaut, cette fonction est désactivée.

🎜Vous pouvez activer ou désactiver la fonction de notification keyspace en modifiant le fichier redis.conf, ou utiliser directement la commande CONFIG SET : 🎜🎜Lorsque le paramètre de l'option notify-keyspace-events est une chaîne vide, la fonction est activée désactivé. 🎜🎜En revanche, lorsque le paramètre n'est pas une chaîne vide, la fonction est activée. Les paramètres de 🎜🎜notify-keyspace-events peuvent être n'importe quelle combinaison des caractères suivants, qui spécifient les types de notifications que le serveur doit envoyer : 🎜🎜Comment SpringBoot surveille-t-il les événements de changement de clé Redis🎜🎜Les paramètres d'entrée doivent avoir au moins un K ou un E code>. Dans le cas contraire, aucune notification ne sera délivrée quels que soient les paramètres restants. 🎜🎜Par exemple, si vous souhaitez uniquement vous abonner aux notifications liées aux listes dans l'espace de clés, alors le paramètre doit être défini sur <code>Kl, et ainsi de suite. 🎜🎜Définissez le paramètre sur la chaîne "AKE" pour indiquer l'envoi de tous les types de notifications. 🎜🎜🎜 Chaque fois qu'une clé est supprimée en raison de son expiration, une notification expirée est générée. 🎜🎜Générez une notification expulsée chaque fois qu'une clé est supprimée pour récupérer de la mémoire en raison de la politique maxmemory. 🎜🎜🎜Toutes les commandes ne généreront des notifications qu'une fois la clé modifiée. 🎜🎜Par exemple, lorsque le membre de clé SREM [membre …] tente de supprimer un élément qui n'existe pas dans la collection, l'opération de suppression échouera car il n'y a pas de véritable changement dans la clé, donc cette opération n’enverra pas de notification. 🎜🎜Si vous avez des questions sur la notification générée par la commande, il est préférable d'utiliser la commande suivante pour la vérifier vous-même : 🎜🎜Redis utilise les deux méthodes suivantes pour supprimer les clés expirées : 🎜🎜🎜Lors de l'accès à une clé, le programme va Cette clé est vérifiée et si la clé a expiré alors la clé sera supprimée. 🎜🎜Le système sous-jacent trouvera et supprimera progressivement les clés expirées en arrière-plan pour traiter les clés qui ont expiré mais qui ne seront pas accessibles. 🎜Lorsqu'une clé expirée est découverte par l'un des deux programmes ci-dessus et que la clé est supprimée de la base de données, Redis génère une notification d'expiration. 🎜🎜🎜Redis ne garantit pas qu'une clé dont le TTL devient 0 sera supprimée immédiatement : si le programme n'accède pas à cette clé expirée, ou s'il y a trop de clés avec un TTL, alors le TTL de la clé devient 0 , il peut y avoir un intervalle de temps significatif jusqu'à ce que la clé soit réellement supprimée. 🎜

因此, Redis 产生expired通知的时间为过期键被删除的时候, 而不是键的生存时间变为 0 的时候。

三、案例

按上文内容,我们先将redis的键空间通知开启,我们开启所有的通知,在可以端中测试后没问题再到代码中测试。

连接到redis 输入一下命令

Comment SpringBoot surveille les événements de changement de clé Redis

config set notify-keyspace-events KEA

  订阅键空间和键事件的主题

Comment SpringBoot surveille les événements de changement de clé Redis

psubscribe &#39;__key*__:*&#39;#对所有库键空间通知
 
psubscribe &#39;__keyspace@2__:*&#39; #是对db2数据库键空间通知
 
psubscribe &#39;__keyspace@2__:order*&#39; #是对db2数据库,key前缀为order所有键的键空间通知

创建一个 key :name valus:zhangsan

set name wsl

观察订阅的窗口 会受到两个消息,第一个是:键空间 第二个是键事件,键空间是内容是操作指令,主题中包含有key,键事件主题中包含了指令,内容是key。

Comment SpringBoot surveille les événements de changement de clé Redis

到这里说明已经开启了键空间通知

代码

以下代码采用string类型演示

在配置一下MessageListenerContainer类,将我们写好的监听类添加到该类中即可,删除和过期都是需要添加,我这里就一起添加了后面就不做演示。

@Configuration
public class RedisConfig {
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    @Autowired
    private RedisUpdateAndAddListener redisUpdateAndAddListener;
 
    @Autowired
    private RedisDeleteListener redisDeleteListener;
 
    @Autowired
    private RedisExpiredListener redisExpiredListener;
 
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //监听所有的key的set事件
        container.addMessageListener(redisUpdateAndAddListener, redisUpdateAndAddListener.getTopic());
        //监听所有key的删除事件
        container.addMessageListener(redisDeleteListener,redisDeleteListener.getTopic());
        //监听所有key的过期事件
        container.addMessageListener(redisExpiredListener,redisExpiredListener.getTopic());
        return container;
    }
 
 
}

新增和修改都是set指令

所以监听的主题都一样,实现MessageListener接口,重写onMessage这里就是收到消息的处理逻辑

@Component
@Data
public class RedisUpdateAndAddListener implements MessageListener {
	//监听的主题
    private  final PatternTopic topic = new PatternTopic("__keyevent@*__:set");
 
    @Override
    public void onMessage(Message message,byte[] pattern){
        String topic = new String(pattern);
        String msg = new String(message.getBody());
        System.out.println("收到key更新或修改,消息主题是:"+ topic+",消息内容是:"+msg);
    }
 
}

在redis中对name这个key进行set操作

set name wsl

在控制台就可以看到name这个key被操作了

Comment SpringBoot surveille les événements de changement de clé Redis

删除

跟上面的更新监听一样,只需要把订阅主题更改一下即可。同样需要添加到这个RedisMessageListenerContainer,上面已经添加,这里不做演示

@Component
@Data
public class RedisDeleteListener implements MessageListener {
 
    //监听主题
    private  final PatternTopic topic = new PatternTopic("__keyevent@*__:del");
 
    /**
     *
     * @param message 消息
     * @param pattern 主题
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String topic = new String(pattern);
        String msg = new String(message.getBody());
        System.out.println("收到key的删除,消息主题是:"+ topic+",消息内容是:"+msg);
    }
}

 在redis输入命令,del name 在控制台可以看到已经收到消息了。

Comment SpringBoot surveille les événements de changement de clé Redis

过期

如上面的操作方式一样

@Data
@Component
public class RedisExpiredListener implements MessageListener {
 
    //监听主题
    private  final PatternTopic topic = new PatternTopic("__keyevent@*__:expired");
 
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String topic = new String(pattern);
        String msg = new String(message.getBody());
        System.out.println("收到key的过期,消息主题是:"+ topic+",消息内容是:"+msg);
    }
}

 在redis中写一个定时删除的keySETEX age 18 3三秒后就可以控制台打印了相关信息

Comment SpringBoot surveille les événements de changement de clé Redis

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer