當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Redis的发布订阅模式以及在SpringBoot中的使用
生活随笔
收集整理的這篇文章主要介紹了
Redis的发布订阅模式以及在SpringBoot中的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.基本介紹
Redis 發布訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
Redis 客戶端可以訂閱任意數量的頻道。
publish(發布命令)
API:publish channel message #發布一條消息到制定頻道
演示:
127.0.0.1:6379> publish cctv:5 "hello world" (integer) 0 #訂閱者個數subscribe(訂閱)
API:subscribe [channel] #訂閱一個或多個頻道
演示:
開啟兩個客戶端,一個客戶端先訂閱cctv:5這個頻道,另一個客戶端往這個頻道發送消息,訂閱者會接收到消息。
?
unsubcribe(取消訂閱)
API:unsubcribe [channel] #取消訂閱一個或多個頻道
演示:
127.0.0.1:6379> unsubscribe cctv:5 1) "unsubscribe" 2) "cctv:5" 3) (integer) 0其它常用API
psubscribe [pattern...] ?#訂閱模式 punsubscribe [pattern...] #退訂制定的模式 pubsub channels #列出至少有一個訂閱者的模式 pubsub numsub [channel...] #列出給定頻道的訂閱者數量 pubsub numpat #列出被訂閱模式的數量2.SpringBoot實現redis的訂閱模式
(1)導入依賴
? ? ? ?<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>(2)配置redis
spring:redis:host: localhostport: 6379(3)redis監聽配置
@Configuration @AutoConfigureAfter({RedisReceiver.class}) public class RedisListenerConfig {/*** redis消息監聽器容器* 可以添加多個監聽不同話題的redis監聽器,只需要把消息監聽器和相應的消息訂閱處理器綁定,該消息監聽器* 通過反射技術調用消息訂閱處理器的相關方法進行一些業務處理** @param connectionFactory* @param listenerAdapter* @return*/@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter listenerAdapter) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory); ?//可以添加多個 messageListenercontainer.addMessageListener(listenerAdapter, new PatternTopic("test")); ?return container;} ? ?/*** 消息監聽器適配器,綁定消息處理器,利用反射技術調用消息處理器的業務方法** @param redisReceiver* @return*/@BeanMessageListenerAdapter listenerAdapter(RedisReceiver redisReceiver) {System.out.println("消息適配器進來了");return new MessageListenerAdapter(redisReceiver, "receiveMessage");} ?/*** 使用默認的工廠初始化redis操作模板** @param connectionFactory* @return*/@BeanStringRedisTemplate template(RedisConnectionFactory connectionFactory) {return new StringRedisTemplate(connectionFactory);} }(4)消息處理類
@Component public class RedisReceiver {/*** 這里是收到通道的消息之后執行的方法** @param message*/public void receiveMessage(String message) {System.out.println("消息來了:" + message);} } ?(5)測試類
@EnableScheduling @Component public class TestController {@Autowiredprivate StringRedisTemplate stringRedisTemplate; ?/*** 向redis消息隊列test通道發布消息*/@Scheduled(fixedRate = 1000)public void sendMessage() {stringRedisTemplate.convertAndSend("test", String.valueOf(Math.random()));} ? }測試結果如下:
消息來了:0.07573790224258636 消息來了:0.6782217218490485 消息來了:0.04274004820156474 消息來了:0.01991680494899495 消息來了:0.21214175193928786 消息來了:0.8152357687137979(6)實現一個方法監聽多個頻道
? ?@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter listenerAdapter) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory); ?//可以添加多個 messageListenercontainer.addMessageListener(listenerAdapter, new PatternTopic("test"));container.addMessageListener(listenerAdapter, new PatternTopic("test2")); ?return container;}這樣之前的receiveMessage方法會接收到來自test和test2兩個頻道的所有消息。
(7)實現不同方法監聽不同頻道
修改我們的配置類,增加消息的適配器參數,之前只有一個適配器參數,現在我們增加到兩個。并把test3的頻道交給第二個適配器接收。
? ?@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter listenerAdapter,MessageListenerAdapter listenerAdapter2) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory); ?//可以添加多個 messageListenercontainer.addMessageListener(listenerAdapter, new PatternTopic("test"));container.addMessageListener(listenerAdapter, new PatternTopic("test2"));container.addMessageListener(listenerAdapter2, new PatternTopic("test3")); ?return container;}@BeanMessageListenerAdapter listenerAdapter(RedisReceiver redisReceiver) {System.out.println("消息適配器進來了");return new MessageListenerAdapter(redisReceiver, "receiveMessage");} ?@BeanMessageListenerAdapter listenerAdapter2(RedisReceiver redisReceiver) {System.out.println("消息適配器2進來了");return new MessageListenerAdapter(redisReceiver, "receiveMessage2");}測試方法:
@EnableScheduling @Component public class TestController {@Autowiredprivate StringRedisTemplate stringRedisTemplate; ?/*** 向redis消息隊列test通道發布消息*/@Scheduled(fixedRate = 1000)public void sendMessage() {stringRedisTemplate.convertAndSend("test", String.valueOf(Math.random()));stringRedisTemplate.convertAndSend("test2", "hello world");} ?@Scheduled(fixedRate = 1000)public void sendMessage2() {stringRedisTemplate.convertAndSend("test3", "hello redis");} ? }測試結果如下:
消息來了:0.21550984623295588 消息來了:hello world 消息來了2:hello redis 消息來了:0.4472284248403804 消息來了:hello world 消息來了2:hello redis 消息來了:0.3441512587764187 消息來了:hello world 消息來了2:hello redis總結
以上是生活随笔為你收集整理的Redis的发布订阅模式以及在SpringBoot中的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis之GEO存储地理位置信息
- 下一篇: SpringBoot集成Redissio