Redis實現消息的發布和訂閱

Redis實現消息的發布和訂閱

1、在springboot項目的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.5</version><relativePath/></parent><groupId>com.example</groupId><artifactId>spring-boot-redis-message</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-boot-redis-message</name><description>spring-boot-redis-message</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2、在application.properties中配置redis參數

# Redis數據庫索引(默認為0)
spring.redis.database=0
# Redis服務器地址
spring.redis.host=127.0.0.1
# Redis服務器連接端口
spring.redis.port=6379
# Redis服務器連接密碼(默認為空)
spring.redis.password=
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active=10
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=-1ms
# 連接池中的最大空閑連接
spring.redis.jedis.pool.max-idle=10
# 連接池中的最小空閑連接
spring.redis.jedis.pool.min-idle=0
# 連接超時時間(毫秒)
spring.redis.timeout=1000ms

3、redis的配置類

package com.example.springbootredismessage.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;import java.net.UnknownHostException;/*** @author zhangshixing* @date 2021年11月06日 9:44* redis 配置類*/
@Configuration
public class RedisConfig {@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();template.setConnectionFactory(redisConnectionFactory);StringRedisSerializer stringSerial = new StringRedisSerializer();// redis key 序列化方式使用stringSerialtemplate.setKeySerializer(stringSerial);// redis value 序列化方式使用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);// redis hash key 序列化方式使用stringSerialtemplate.setHashKeySerializer(stringSerial);// redis hash value 序列化方式使用jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}
}

4、redis消息發布和監聽

4.1 發送消息

package com.example.springbootredismessage.controller;import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** @author zhangshixing* @date 2021年11月07日 11:18*/
@RestController
@RequestMapping(value = "rest/redis")
public class RedisSendMessageController {@Resourceprivate RedisTemplate redisTemplate;@RequestMapping(value = "send/message", method = RequestMethod.GET)public void testPush(@RequestParam("body") String body) {/*** 使用redisTemplate的convertAndSend()函數,* String channel, Object message* channel代表管道,* message代表發送的信息*/redisTemplate.convertAndSend("test_topic", body);System.out.println("發送消息成功,channel:test_topic , messgae:" + body);}
}

4.2 接收消息

package com.example.springbootredismessage.config;import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Component;import java.io.UnsupportedEncodingException;/*** @author zhangshixing* @date 2021年11月07日 11:22* redis訂閱方:接收消息* 為了接收 Redis 渠道發送過來的消息,我們先定義一個消息監聽器( MessageListener )*/
@Component
public class MyRedisSubscribeListener implements MessageListener {/*** 這里的 onMessage 方法是得到消息后的處理方法, 其中 message 參數代表 Redis 發送過來的消息,* pattern是渠道名稱,onMessage方法里打印了它們的內容。這里因為標注了@Component注解,所以* 在Spring Boot掃描后,會把它自動裝配到IoC容器中 ,監聽著對象RedisMessageListener會自動* 將消息進行轉換。** @param message* @param bytes*/@Overridepublic void onMessage(Message message, byte[] bytes) {System.out.println("接收消息!");//消息體String body = null;try {//解決string亂碼body = new String(message.getBody(), "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}//渠道名稱String topic = new String(bytes);System.out.println("消息體:" + body);System.out.println("渠道名稱:" + topic);}
}

5、啟動類

package com.example.springbootredismessage;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringBootRedisMessageApplication {public static void main(String[] args) {SpringApplication.run(SpringBootRedisMessageApplication.class, args);}}

6、測試

http://localhost:8080/rest/redis/send/message?body=helloworld

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37051.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37051.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37051.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cookie和session的區別,分布式環境怎么保存用戶狀態

1、cookie數據存放在客戶的瀏覽器上&#xff0c;session數據放在服務器上。 2、cookie不是很安全&#xff0c;別人可以分析存放在本地的COOKIE并進行COOKIE欺騙&#xff0c;考慮到安全應當使用session。 3、session會在一定時間內保存在服務器上。當訪問增多&#xff0c;會比…

js和cocos creator學習筆記

1.Javascript有哪些數據類型?舉例兩個最常見的內置對象數據類型? 常用的數據類型:Number,String,Boolean,Null,Undefined,Object 常見內置對象:Array,Function2.下面代碼輸出內容是什么? let a []; a[10] 10; console.log(a.length); console.log(a[0]); a[200] undefi…

arcpy創建基本要素:折線和多邊形

目錄 創建Polyline折線要素步驟一&#xff1a;創建空間參考步驟二&#xff1a;創建屬性類步驟三&#xff1a;創建字段步驟四&#xff1a;創建記錄并插入幾何信息 創建Polygon多邊形要素步驟一&#xff1a;創建空間參考&#xff08;同上&#xff09;步驟二&#xff1a;創建要素類…

Redis使用Lua腳本和Redisson來保證庫存扣減中的原子性和一致性

文章目錄 前言1.使用SpringBoot Redis 原生實現方式2.使用redisson方式實現3. 使用RedisLua腳本實現3.1 lua腳本代碼邏輯 3.2 與SpringBoot集成 4. Lua腳本方式和Redisson的方式對比5. 源碼地址6. Redis從入門到精通系列文章7. 參考文檔 前言 背景&#xff1a;最近有社群技術交…

C++——函數重載及底層原理

函數重載的定義 函數重載&#xff1a; 是函數的一種特殊情況&#xff0c;C允許在同一作用域重聲明幾個功能類似的同名函數&#xff0c;這些同名函數的形參列表&#xff08;參數個數或者類型&#xff0c;類型的順序&#xff09;不同&#xff0c;常用來處理實現功能類似數據結構…

C語言字符串拷貝函數詳解及示例代碼

目錄 簡介字符串拷貝函數 strcpy字符串拷貝函數 strcpy_s使用示例注意事項結束語 1. 簡介 字符串拷貝是C語言中常用的操作之一。當需要將一個字符串復制到另一個字符串數組中時&#xff0c;可以使用字符串拷貝函數來實現。C語言提供了多種字符串拷貝函數&#xff0c;其中最常…

春秋云鏡 CVE-2021-41947

春秋云鏡 CVE-2021-41947 Subrion CMS v4.2.1 存在sql注入 靶標介紹 Subrion CMS v4.2.1 存在sql注入。 啟動場景 漏洞利用 exp http://localhost/panel/visual-mode.json?getaccess&typeblocks UNION ALL SELECT username, password FROM sbr421_members -- -&o…

【需求輸出】流程圖輸出

文章目錄 1、什么是流程圖2、繪制流程圖的工具和基本要素3、流程圖的分類和應用場景4、如何根據具體場景輸出流程圖 1、什么是流程圖 2、繪制流程圖的工具和基本要素 3、流程圖的分類和應用場景 4、如何根據具體場景輸出流程圖

Dubbo1-架構的演變

分布式系統上的相關概念 項目&#xff1a;傳統項目、互聯網項目 傳統項目&#xff1a; 一般為公司內部使用&#xff0c;或者小群體小范圍的使用&#xff0c;一般不要求性能&#xff0c;美觀&#xff0c;并發等 互聯網項目的特點&#xff1a; 1.用戶多 2.流量大&#xff0c;并…

用python來爬取某魚的商品信息(2/2)

目錄 上一篇文章 本章內容 設置瀏覽器為運行結束后不關閉&#xff08;可選&#xff09; 定位到搜索框的xpath地址 執行動作 獲取cookie 保存為json文件 修改cookie的sameSite值并且導入cookie 導入cookie&#xff08;出錯&#xff09; 導入cookie&#xff08;修改后&…

Android Ble藍牙App(五)數據操作

Ble藍牙App&#xff08;五&#xff09;數據操作 前言正文一、操作內容處理二、讀取數據① 概念② 實操 三、寫入數據① 概念② 實操 四、打開通知一、概念二、實操三、收到數據 五、源碼 前言 關于低功耗藍牙的服務、特性、屬性、描述符都已經講清楚了&#xff0c;而下面就是使…

電腦系統重裝日記

重裝原因 電腦C盤幾乎爆炸故重裝系統一清二白 此片原因 記錄重裝過程&#xff0c;強調一些要注意的點&#xff0c;以防日后重裝。 重裝過程 1.清空電腦文件后重啟&#xff0c;電腦冒藍光&#xff0c;一直藍屏反復重啟&#xff0c;故只能重裝系統以解難題。 2.準備一個U盤&…

設計HTML5文檔結構

定義清晰、一致的文檔結構不僅方便后期維護和拓展&#xff0c;同時也大大降低了CSS和JavaScript的應用難度。為了提高搜索引擎的檢索率&#xff0c;適應智能化處理&#xff0c;設計符合語義的結構顯得很重要。 1、頭部結構 在HTML文檔的頭部區域&#xff0c;存儲著各種網頁元…

Python Opencv實踐 - 圖像屬性相關

import numpy as np import cv2 as cv import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) plt.imshow(img[:,:,::-1])#像素操作 pixel img[320,370] print(pixel)#只獲取藍色通道的值 pixel_blue img[320,370,0]…

【Hystrix技術指南】(7)故障切換的運作流程原理分析(含源碼)

背景介紹 目前對于一些非核心操作&#xff0c;如增減庫存后保存操作日志發送異步消息時&#xff08;具體業務流程&#xff09;&#xff0c;一旦出現MQ服務異常時&#xff0c;會導致接口響應超時&#xff0c;因此可以考慮對非核心操作引入服務降級、服務隔離。 Hystrix說明 官方…

Grounding DINO:根據文字提示檢測任意目標

文章目錄 1. 背景介紹2. 方法創新2.1 Feature Extraction and Enhancer2.2 Language-Guided Query Selection2.3 Cross-Modality Decoder2.4 Sub-Sentence Level Text Feature2.5 Loss Function3. 實驗結果3.1 Zero-Shot Transfer of Grounding DINO3.2 Referring Object Detec…

設備管理系統能起到什么作用?

在現代工業運營中&#xff0c;設備的高效管理和維護對于保障生產穩定運行和提升企業競爭力至關重要。而設備管理系統作為一種關鍵工具&#xff0c;能夠極大地提高企業的生產效率和設備維護的準確性。本文將深入探討設備管理系統的作用&#xff0c;以PreMaint設備數字化平臺為例…

Qt 對象序列化/反序列化

閱讀本文大概需要 3 分鐘 背景 日常開發過程中&#xff0c;避免不了對象序列化和反序列化&#xff0c;如果你使用 Qt 進行開發&#xff0c;那么有一種方法實現起來非常簡單和容易。 實現 我們知道 Qt 的元對象系統非常強大&#xff0c;基于此屬性我們可以實現對象的序列化和…

智能家居(3)---socket網絡控制線程封裝

封裝socket網絡線程實現對智能家居中各種燈光的控制 main.Pro(主函數) #include <stdio.h> #include "controlDevice.h" #include "inputCommand.h" #include <pthread.h>struct Devices *pdeviceHead NULL; //設備工廠鏈表…

ES踩坑記錄之UNASSIGNED分片無法恢復

問題背景 換節點 我們線上有一套ES集群&#xff0c;三臺機器&#xff0c;共運行了6個節點。一直在線上跑了幾個月也一直沒出什么問題。然而好巧不巧&#xff0c;就在昨天&#xff0c;集群中的3號節點磁盤出現故障&#xff0c;導致機器直接癱瘓。本來大家覺得問題不大&#xf…