日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。