Comment SpringBoot surveille les événements de changement de clé Redis
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 的参数可以是以下字符的任意组合, 它指定了服务器该发送哪些类型的通知:
输入的参数中至少要有一个 K
或者 E
, 否则的话, 不管其余的参数是什么, 都不会有任何通知被分发。
举个例子, 如果只想订阅键空间中和列表相关的通知, 那么参数就应该设为 Kl
, 诸如此类。
将参数设为字符串"AKE"
表示发送所有类型的通知。
每当一个键因为过期而被删除时,产生一个
expired
通知。每当一个键因为
maxmemory
政策而被删除以回收内存时,产生一个evicted
通知。
所有命令都只在键真的被改动了之后,才会产生通知。
比如说,当 SREM key member [member …]
config set notify-keyspace-events KEA
3. Configuration
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 .
É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 : 🎜🎜
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 输入一下命令
config set notify-keyspace-events KEA
订阅键空间和键事件的主题
psubscribe '__key*__:*'#对所有库键空间通知 psubscribe '__keyspace@2__:*' #是对db2数据库键空间通知 psubscribe '__keyspace@2__:order*' #是对db2数据库,key前缀为order所有键的键空间通知
创建一个 key :name valus:zhangsan
set name wsl
观察订阅的窗口 会受到两个消息,第一个是:键空间 第二个是键事件,键空间是内容是操作指令,主题中包含有key,键事件主题中包含了指令,内容是key。
到这里说明已经开启了键空间通知
代码
以下代码采用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被操作了
删除
跟上面的更新监听一样,只需要把订阅主题更改一下即可。同样需要添加到这个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
在控制台可以看到已经收到消息了。
过期
如上面的操作方式一样
@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
三秒后就可以控制台打印了相关信息
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Le mode Redis Cluster déploie les instances Redis sur plusieurs serveurs grâce à la rupture, à l'amélioration de l'évolutivité et de la disponibilité. Les étapes de construction sont les suivantes: Créez des instances de redis étranges avec différents ports; Créer 3 instances Sentinel, Moniteur Redis Instances et basculement; Configurer les fichiers de configuration Sentinel, ajouter des informations d'instance Redis de surveillance et des paramètres de basculement; Configurer les fichiers de configuration d'instance Redis, activer le mode de cluster et spécifier le chemin du fichier d'informations de cluster; Créer un fichier nœuds.conf, contenant des informations de chaque instance redis; Démarrez le cluster, exécutez la commande CREATE pour créer un cluster et spécifiez le nombre de répliques; Connectez-vous au cluster pour exécuter la commande d'informations de cluster pour vérifier l'état du cluster; faire

Comment effacer les données Redis: utilisez la commande flushall pour effacer toutes les valeurs de clé. Utilisez la commande flushdb pour effacer la valeur clé de la base de données actuellement sélectionnée. Utilisez SELECT pour commuter les bases de données, puis utilisez FlushDB pour effacer plusieurs bases de données. Utilisez la commande del pour supprimer une clé spécifique. Utilisez l'outil Redis-CLI pour effacer les données.

Pour lire une file d'attente à partir de Redis, vous devez obtenir le nom de la file d'attente, lire les éléments à l'aide de la commande LPOP et traiter la file d'attente vide. Les étapes spécifiques sont les suivantes: Obtenez le nom de la file d'attente: Nommez-le avec le préfixe de "Fitre:" tel que "Fitre: My-Quyue". Utilisez la commande LPOP: éjectez l'élément de la tête de la file d'attente et renvoyez sa valeur, telle que la file d'attente LPOP: My-Queue. Traitement des files d'attente vides: si la file d'attente est vide, LPOP renvoie NIL et vous pouvez vérifier si la file d'attente existe avant de lire l'élément.

L'utilisation de la directive Redis nécessite les étapes suivantes: Ouvrez le client Redis. Entrez la commande (Verbe Key Value). Fournit les paramètres requis (varie de l'instruction à l'instruction). Appuyez sur Entrée pour exécuter la commande. Redis renvoie une réponse indiquant le résultat de l'opération (généralement OK ou -err).

L'utilisation des opérations Redis pour verrouiller nécessite l'obtention du verrouillage via la commande setnx, puis en utilisant la commande Expire pour définir le temps d'expiration. Les étapes spécifiques sont les suivantes: (1) Utilisez la commande setnx pour essayer de définir une paire de valeurs de clé; (2) Utilisez la commande Expire pour définir le temps d'expiration du verrou; (3) Utilisez la commande del pour supprimer le verrouillage lorsque le verrouillage n'est plus nécessaire.

La meilleure façon de comprendre le code source redis est d'aller étape par étape: familiarisez-vous avec les bases de Redis. Sélectionnez un module ou une fonction spécifique comme point de départ. Commencez par le point d'entrée du module ou de la fonction et affichez le code ligne par ligne. Affichez le code via la chaîne d'appel de fonction. Familiez les structures de données sous-jacentes utilisées par Redis. Identifiez l'algorithme utilisé par Redis.

Utilisez l'outil de ligne de commande redis (Redis-CLI) pour gérer et utiliser Redis via les étapes suivantes: Connectez-vous au serveur, spécifiez l'adresse et le port. Envoyez des commandes au serveur à l'aide du nom et des paramètres de commande. Utilisez la commande d'aide pour afficher les informations d'aide pour une commande spécifique. Utilisez la commande QUIT pour quitter l'outil de ligne de commande.

Les causes de la perte de données redis incluent les défaillances de mémoire, les pannes de courant, les erreurs humaines et les défaillances matérielles. Les solutions sont: 1. Stockez les données sur le disque avec RDB ou AOF Persistance; 2. Copiez sur plusieurs serveurs pour une haute disponibilité; 3. Ha avec Redis Sentinel ou Redis Cluster; 4. Créez des instantanés pour sauvegarder les données; 5. Mettre en œuvre les meilleures pratiques telles que la persistance, la réplication, les instantanés, la surveillance et les mesures de sécurité.
