日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Redis的发布订阅模式以及在SpringBoot中的使用

發布時間:2025/3/20 javascript 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。