當前位置:
首頁 >
Redis的发布订阅模式以及在SpringBoot中的使用
發(fā)布時間:2025/3/20
60
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Redis的发布订阅模式以及在SpringBoot中的使用
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.基本介紹
Redis 發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息,訂閱者(sub)接收消息。
Redis 客戶端可以訂閱任意數(shù)量的頻道。
publish(發(fā)布命令)
API:publish channel message #發(fā)布一條消息到制定頻道
演示:
127.0.0.1:6379> publish cctv:5 "hello world" (integer) 0 #訂閱者個數(shù)subscribe(訂閱)
API:subscribe [channel] #訂閱一個或多個頻道
演示:
開啟兩個客戶端,一個客戶端先訂閱cctv:5這個頻道,另一個客戶端往這個頻道發(fā)送消息,訂閱者會接收到消息。
?
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...] #列出給定頻道的訂閱者數(shù)量 pubsub numpat #列出被訂閱模式的數(shù)量2.SpringBoot實現(xiàn)redis的訂閱模式
(1)導(dǎo)入依賴
? ? ? ?<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監(jiān)聽配置
@Configuration @AutoConfigureAfter({RedisReceiver.class}) public class RedisListenerConfig {/*** redis消息監(jiān)聽器容器* 可以添加多個監(jiān)聽不同話題的redis監(jiān)聽器,只需要把消息監(jiān)聽器和相應(yīng)的消息訂閱處理器綁定,該消息監(jiān)聽器* 通過反射技術(shù)調(diào)用消息訂閱處理器的相關(guān)方法進行一些業(yè)務(wù)處理** @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;} ? ?/*** 消息監(jiān)聽器適配器,綁定消息處理器,利用反射技術(shù)調(diào)用消息處理器的業(yè)務(wù)方法** @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 {/*** 這里是收到通道的消息之后執(zhí)行的方法** @param message*/public void receiveMessage(String message) {System.out.println("消息來了:" + message);} } ?(5)測試類
@EnableScheduling @Component public class TestController {@Autowiredprivate StringRedisTemplate stringRedisTemplate; ?/*** 向redis消息隊列test通道發(fā)布消息*/@Scheduled(fixedRate = 1000)public void sendMessage() {stringRedisTemplate.convertAndSend("test", String.valueOf(Math.random()));} ? }測試結(jié)果如下:
消息來了:0.07573790224258636 消息來了:0.6782217218490485 消息來了:0.04274004820156474 消息來了:0.01991680494899495 消息來了:0.21214175193928786 消息來了:0.8152357687137979(6)實現(xiàn)一個方法監(jiān)聽多個頻道
? ?@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)實現(xiàn)不同方法監(jiān)聽不同頻道
修改我們的配置類,增加消息的適配器參數(shù),之前只有一個適配器參數(shù),現(xiàn)在我們增加到兩個。并把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通道發(fā)布消息*/@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");} ? }測試結(jié)果如下:
消息來了:0.21550984623295588 消息來了:hello world 消息來了2:hello redis 消息來了:0.4472284248403804 消息來了:hello world 消息來了2:hello redis 消息來了:0.3441512587764187 消息來了:hello world 消息來了2:hello redis總結(jié)
以上是生活随笔為你收集整理的Redis的发布订阅模式以及在SpringBoot中的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis之GEO存储地理位置信息
- 下一篇: SpringBoot集成Redissio