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

    }



}

测试结果:

在这里插入图片描述


代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值