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

Comment utiliser la méthode de publication et d'abonnement Redis pour implémenter un système de messagerie simple

WBOY
WBOYavant
2023-05-26 20:52:311316parcourir

I. Utilisation de base

1. Configuration

Nous utilisons SpringBoot 2.2.1.RELEASE pour construire l'environnement du projet, directement dans pom.xml2.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:

2. 使用姿势

redis 的发布/订阅,主要就是利用两个命令publish/subscribe; 在 SpringBoot 中使用发布订阅模式比较简单,借助 RedisTemplate 可以很方便的实现

a. 消息发布

@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;
            }
        });
    }
}

b. 订阅消息

消息订阅这里,需要注意我们借助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;
        }
    });
}

c. 测试 case

写一个简单的测试 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

2. Utilisez la posture

redis submit/subscribe, principalement en utilisant deux commandes publish/subscribe; Il est relativement simple d'utiliser le mode publication-abonnement dans SpringBoot. Il peut être facilement implémenté à l'aide de RedisTemplate

a.

b. Message d'abonnement

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

c. Cas de test

É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

Nous créons d'abord deux consommateurs, puis lors de l'envoi d'un message, les deux sont reçus puis ajoutons un nouveau consommateur, et lors de l'envoi d'un message, les trois sont reçus#🎜 ; 🎜##🎜 🎜#3. Mode d'emploi et scénarios d'application
  • La publication et l'abonnement de Redis ne conviennent qu'à des scénarios relativement simples. Comme le montrent les instructions d'utilisation ci-dessus, il s'agit d'un simple. modèle de publication et d'abonnement qui prend en charge 1 à N, et le message envoyé ne peut être obtenu que par les consommateurs en ligne (comme pour ceux qui ne sont pas en ligne, on ne peut que dire que c'est dommage) et pour Redis, c'est fini après le message est expulsé. Quant à savoir si les consommateurs peuvent Consommation normale, alors peu importe

    Point clé :
  • Seuls les consommateurs en ligne peuvent recevoir le message
  • #🎜 🎜#

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émoire

L'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 Config

Amis 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énement

Modifiez 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#🎜🎜#rrreee

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