1. 程式人生 > >Redis之訊息佇列

Redis之訊息佇列

SpringBoot 結合redis實現訊息佇列功能

釋出者:
配置連線工廠

  @Bean
    public StringRedisTemplate template(RedisConnectionFactory connectionFactory){
        return new StringRedisTemplate(connectionFactory);
    }

配置Redis template

@Autowired
private StringRedisTemplate stringRedisTemplate;


public void sendMessage(Object message) {
stringRedisTemplate.convertAndSend(this.productActiveMQQueue,"傳送新訊息");
}

訂閱者:
建立連線工廠
繫結訊息監聽者和接收監聽的方法
註冊訂閱者
計數器,控制執行緒

@Configuration
public class SubscriberConfig {
     //建立連線工廠
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                                   MessageListenerAdapter listenerAdapter){
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter,new PatternTopic("phone"));  //監聽phone的訂閱者
        return container;
    }

  //繫結監聽者和監聽方法
    @Bean
    public MessageListenerAdapter listenerAdapter(Receiver receiver){
        return new MessageListenerAdapter(receiver,"receiveMessage"); //這裡選擇指定的MessageListener和指定的處理方法
    }

 
  //計數器
    @Bean
    public CountDownLatch latch(){
        return new CountDownLatch(1);//指定了計數的次數 1
    }
}

可以根據型別 多用幾個類 繼承MessageListener 重寫onMessage() 來解析不同型別的訊息
即產生不同的訂閱者

public class Receiver implements MessageListener {  

           private CountDownLatch id;
public Receiver(CountDownLatch id)
{
this.id=id;
}
    public void onMessage(Message message) {  
        //這裡我們知道生產者傳送的就是一個純文字訊息,所以這裡可以直接進行強制轉換,或者直接把onMessage方法的引數改成Message的子類TextMessage  
        TextMessage textMsg = (TextMessage) message;  
        System.out.println("接收到一個純文字訊息。");  
        try {  
            System.out.println("訊息內容是:" + textMsg.getText());  
        } catch (JMSException e) {  
            e.printStackTrace();  
        }  
    }  
   
}  

redis相對於ActiveMQ (入隊時資料較大時,redis效能較弱)
入隊時,當資料比較小時Redis的效能要高於ActiveMQ,而如果資料大小超過了10K,Redis則慢的無法忍受;
出隊時,無論資料大小,Redis都表現出非常好的效能,而ActiveMQ的出隊效能則遠低於Redis。