Redis - 发布与订阅及Springboot实现

Redis客户端的发布订阅

Redis提供了发布订阅(pub/sub)的消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息

发布订阅是客户端进行的,与数据库无关,一个客户端可以订阅多个频道(channel),一个频道可以被多个客户端订阅

  • 订阅:
    subscribe channel[channel...]订阅一个或多个频道
    psubscribe pattern[pattern...]订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所有名字以it开头的频道

订阅后,客户端为阻塞状态,等待发布者发布信息
在这里插入图片描述

  • 发布
    publish channel message将消息发送到指定频道

发送消息后,返回值为订阅该频道的客户端数
在这里插入图片描述

客户端接收到信息
在这里插入图片描述

  • 退订
    unsubscribe channel[channel...]退订指定的频道
    punsubscrib pattern[pattern...]退订所有给定模式的频道

Springboot实现发布订阅

使用Lettuce客户端:SpringBoot - 整合Redis:解析Lettuce与RedisTemplate封装

项目有四个部分:

  • 配置类RedisConfig:RedisTemplate、监听器的配置
  • 工具类RedisReceiver:订阅者接收信息后的处理方法
  • application.yml:连接Redis
  • PubsubApplicationTests:测试类
    在这里插入图片描述

RedisReceiver

接收通道信息后的业务:这里仅控制台输出

package com.redis.pubsub.util;

import org.springframework.stereotype.Component;

/**
 * Author : zfk
 * Data : 11:40
 */

@Component
public class RedisReceiver {

    //收到通道的消息后执行的监听方法:要和Config中MessageListenerAdapter对应
    public void receiveMessage(String message){
        System.out.println(message);
    }
}

RedisConfig

配置类向Spring容器注入了3个bean:

  • RedisTemplate封装Lettuce
package com.redis.pubsub.config;


import com.redis.pubsub.util.RedisReceiver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;

/**
 * Author : zfk
 * Data : 11:43
 */
@Configuration
public class RedisConfig {

    //序列化格式
    @Bean
    public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory factory){
        RedisTemplate<String,Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        return template;
    }

	//监听器容器
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter listenerAdapter){
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();

        container.setConnectionFactory(connectionFactory);
        //容器可以添加多个MessageListenerAdapter,也就是监听多个通道
        container.addMessageListener(listenerAdapter,new PatternTopic("Test"));

        return container;
    }


    /**
     * 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
     * @param receiver
     * @return
     */
    @Bean
    MessageListenerAdapter listenerAdapter(RedisReceiver receiver) {
        System.out.println("消息适配器1");
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

}

application.yml

连接Redis的配置,yml语法(使用application.properties也可以)

spring:
  redis:
    host: ip地址
    password: 密码
    port: 6379
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 2
        max-wait: 1000

    timeout: 10000

PubsubApplicationTests

测试类:注入RedisTemplate,当前线程每两秒发送一次信息

package com.redis.pubsub;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.Date;

@SpringBootTest
class PubsubApplicationTests {

    @Autowired
    private RedisTemplate<String,Object> template;

    @Test
    void contextLoads() {

        for (int i = 0;i < 5;i++){
            try {
                Thread.sleep(2000);
            }
            catch (Exception e){
                e.getMessage();
            }
            template.convertAndSend("Test",String.format("我是消息{%d}号: %tT", i, new Date()));
        }

    }



}

测试结果:

在这里插入图片描述


代码

我的码云,有兴趣可以查看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,可以通过使用Spring Data RedisSpring Framework提供的一些组件来实现Redis发布订阅。 首先,需要在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 然后,在application.properties文件中配置Redis连接信息: ``` spring.redis.host=127.0.0.1 spring.redis.port=6379 ``` 接下来,创建一个Redis配置类,用于配置RedisTemplate和MessageListenerContainer: ``` @Configuration public class RedisConfig { @Autowired private RedisConnectionFactory redisConnectionFactory; @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); redisTemplate.setDefaultSerializer(new StringRedisSerializer()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); return redisTemplate; } @Bean public MessageListenerContainer messageListenerContainer() { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(redisConnectionFactory); return container; } } ``` 然后,创建一个Redis消息监听器,用于处理消息: ``` @Component public class RedisMessageSubscriber implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { System.out.println("Received message: " + message.toString()); } } ``` 最后,在需要监听Redis消息的地方,注入MessageListenerContainer和RedisMessageSubscriber,并使用它们来订阅频道: ``` @Service public class MyService { @Autowired private MessageListenerContainer messageListenerContainer; @Autowired private RedisMessageSubscriber redisMessageSubscriber; public void subscribe(String channel) { messageListenerContainer.addMessageListener(redisMessageSubscriber, new ChannelTopic(channel)); } } ``` 以上就是使用Spring Boot实现Redis发布订阅的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值