spring boot + redis 实现信息的发送和接收(pub/sub)

redis本身就带有发送接收的功能,用redis来发送接收的方法如下:
1.redis侦听的方法
  
2.redis发送信息的方法

3.刚才1中的画面中应该能看到如下内容

从以上看来redis-cli带有发送接收信息的功能,但是用spring-data-redis如何来实现呢,其实比较简单,可以有两个方法,一个方法通过实现MessageListener接口类实现,但是他有一个问题,在侦听信息需要借助于redisconnectfactory的connection来进行,且是阻塞模式下的,可以借助线程的方式来进行,方法如下:

1.在yml文件增加以下内容,主是为了设定redis的topic
   redis.msg.test.chanel: msgchanel 
2.建里listener的Bean,且以线程的方式来启动

@Component
public class ReciveMsgListener  extends Thread implements MessageListener {
    @Autowired
    private Environment env;     
    private RedisTemplate redisTemplate;    
    private String chanel;            
    public ReciveMsgListener(@Autowired RedisTemplate redisTemplate) {         
        this.redisTemplate=redisTemplate;
        this.start();
    }

   
    @Override
    public void onMessage(Message message, byte[] pattern) {
        // TODO Auto-generated method stub
        System.out.println("on Message");
        byte[] msgBody= message.getBody();
        System.out.println("  recive "+msgBody==null?"empty":new String(msgBody));
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true) {
            System.out.println("on listen "+this.chanel);
           redisTemplate.getConnectionFactory().getClusterConnection().subscribe(this, env.getProperty("redis.msg.test.chanel").getBytes());            
        }
    }    

 }
3.在某个controller类增加如下内容,主要借助redistemplate.convertadnsend方法来进行
   @Autowired
    private RedisTemplate redisTemplate    
   @RequestMapping("/redis/publish/{msg}")
    public String sendmsg(@PathVariable String msg) {
        
        //(new Thread(this.listenMsg)).start();
        this.redisTemplate.convertAndSend(env.getProperty("redis.msg.test.chanel"), msg);
        //listenMsg.recieMsg();
        return "success";                
    }
   但是你也可以借于redisconnectfactory的connection来进行,不是通过二进度的方式来进行
   byte[] msg = ...
   byte[] channel = ...
   con.publish(msg, channel);

4.可以ie中输入http://localhost:9001//redis/publish/hello ni hao 后,你可以在日志中看到如下内容

从以上方法看起来比较麻烦需要借助于线程的方法来进行,其实spring提供了另外一种方式,主要是RedisMessageListenerContainer类,方法如下:
@Bean
    public     RedisMessageListenerContainer  redisMsgListenContainer(@Autowired ReciveMsgListener listener,@Autowired RedisConnectionFactory connectFactory) {
        RedisMessageListenerContainer container=new RedisMessageListenerContainer();
        Topic topic=new ChannelTopic(env.getProperty("redis.msg.test.chanel"));//生成topic
        container.addMessageListener(listener, topic);//设定listener和topic
        container.setConnectionFactory(connectFactory);//设定redisfactory
        return container;
    }
这里的redisconnectionfactory bean的实现如下,请参考
   @Bean
    public RedisConnectionFactory connectionFactory(@Autowired RedisNodeConfig redisConfig) {            
        JedisConnectionFactory redisFactory= new JedisConnectionFactory(
                new RedisClusterConfiguration(redisConfig.getNodes()));
        return    redisFactory;        
    }

@Component
@ConfigurationProperties(prefix = "spring.redis.cluster")
public class RedisNodeConfig {    
   private List<String> nodes;
   
    public List<String> getNodes() {
        return nodes;
    }
    
    public void setNodes(List<String> nodes) {
        this.nodes = nodes;
    }      
}
以上内容中spring.redis.cluster需要在yml增加主要是redis的cluster的信息
spring:  
  redis:
    cluster:
       nodes:
         - 127.0.0.1:7000
         - 127.0.0.1:7001
         - 127.0.0.1:7002
         - 127.0.0.1:7003
         - 127.0.0.1:7004
         - 127.0.0.1:7005

然在ie中http://localhost:9001//redis/publish/hello ni hao 你会看到两个都能信息

 

 


  


 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值