Maison > Article > base de données > Comment utiliser la méthode de publication et d'abonnement Redis pour implémenter un système de messagerie simple
Nous utilisons SpringBoot 2.2.1.RELEASE
pour construire l'environnement du projet, directement dans 2.2.1.RELEASE
来搭建项目环境,直接在pom.xml
中添加 redis 依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
如果我们的 redis 是默认配置,则可以不额外添加任何配置;也可以直接在application.yml
配置中,如下
spring: redis: host: 127.0.0.1 port: 6379 password:
redis 的发布/订阅,主要就是利用两个命令publish/subscribe
; 在 SpringBoot 中使用发布订阅模式比较简单,借助 RedisTemplate 可以很方便的实现
@Service public class PubSubBean { @Autowired private StringRedisTemplate redisTemplate; public void publish(String key, String value) { redisTemplate.execute(new RedisCallback<Object>() { @Override public Object doInRedis(RedisConnection redisConnection) throws DataAccessException { redisConnection.publish(key.getBytes(), value.getBytes()); return null; } }); } }
消息订阅这里,需要注意我们借助org.springframework.data.redis.connection.MessageListener
来实现消费逻辑
public void subscribe(MessageListener messageListener, String key) { redisTemplate.execute(new RedisCallback<Object>() { @Override public Object doInRedis(RedisConnection redisConnection) throws DataAccessException { redisConnection.subscribe(messageListener, key.getBytes()); return null; } }); }
写一个简单的测试 case,来验证一下上面的发布订阅,顺带理解一下这个MessageListener
@RestController @RequestMapping(path = "rest") public class DemoRest { @Autowired private PubSubBean pubSubBean; // 发布消息 @GetMapping(path = "pub") public String pubTest(String key, String value) { pubSubBean.publish(key, value); return "over"; } // 新增消费者 @GetMapping(path = "sub") public String subscribe(String key, String uuid) { pubSubBean.subscribe(new MessageListener() { @Override public void onMessage(Message message, byte[] bytes) { System.out.println(uuid + " ==> msg:" + message); } }, key); return "over"; } }Si notre redis est la configuration par défaut, vous n'avez pas besoin d'ajouter de configuration supplémentaire, vous pouvez également l'ajouter directement dans application.yml code>, comme suit
notify-keyspace-events Ex
Abonnement au message ici, veuillez noter que nous utilisons org.springframework.data.redis.connection.MessageListener
pour implémenter la logique de consommation
subscribe __keyevent@0__:expired
Écrivez un cas de test simple pour vérifier la publication et l'abonnement ci-dessus, et comprenez la posture d'utilisation de ce MessageListener
; projet et fournissons deux interfaces de repos#🎜 🎜#rrreee
Les consommateurs ne peuvent recevoir un message qu'une seule fois
La question suivante devient, dans quelles circonstances cela peut-il être fait ? Qu'en est-il de la publication et de l'abonnement en utilisant Redis ?
Invalidation du cache basée sur la mémoireL'utilisation de reids + mémoire pour le cache secondaire peut être considérée comme une méthode relativement courante avec l'aide de. cache basé sur la mémoire Le cache peut effectivement augmenter la charge du système, mais le problème est également évident. L'invalidation des données mises en cache en mémoire est un problème, en particulier lorsqu'une application est déployée sur plusieurs serveurs. tous les serveurs en même temps, utiliser la publication/abonnement Redis est un meilleur choix
Actualisation de la configuration de SpringCloud ConfigAmis qui utilisent SpringCloud Config comme un centre de configuration peut-être que je rencontre souvent ce problème. L'actualisation dynamique après modification de la configuration est un problème (bien sûr, le support officiel consiste à synchroniser via le bus via mq, et vous pouvez également forcer l'actualisation via l'administrateur Spring Boot) # 🎜🎜#Publier/s'abonner avec redis, implémenter l'actualisation dynamique de la configuration est également une bonne alternative (une démo d'implémentation spécifique sera donnée plus tard, si vous êtes intéressé, veuillez continuer à suivre le blog Yihuihui)
#🎜 🎜#abonnement à la clé redis expiré# 🎜🎜#Lorsque nous utilisons Redis pour la mise en cache, nous définissons généralement un délai d'expiration. Redis fournit un événement d'expiration, qui bien sûr n'est pas activé par défaut, nous pouvons également le faire. abonnez-vous à l'invalidation du cache via l'abonnement ÉvénementModifiez la configuration et activez l'événement d'échec de clérrreee
Après le redémarrage de Redis, abonnez-vous à l'événement d'échec#🎜🎜#rrreeeCe 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!