Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱的代碼
一.創(chuàng)建spring boot項(xiàng)目
<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> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.41</version> </dependency>
二.編輯yml配置文件
server: port: 7888 # 日志配置 logging: config: classpath:log/logback.xml level: cn.com.dhcc: info org.springframework: info org.springframework.web: info com.alibaba.nacos.client.naming: error spring: redis: host: localhost port: 6379 password: ********* database: 1 jedis: pool: max-idle: 8 max-active: 8 max-wait: -1 min-idle: 0 timeout: 5000
三.配置Redis
@Configuration
public class RedisConfiguration {
/**
* 實(shí)例化 RedisTemplate 對(duì)象
*
* @return
*/
@Bean("RedisTemplateS")
public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
return redisTemplate;
}
/**
* 設(shè)置數(shù)據(jù)存入 redis 的序列化方式,并開(kāi)啟事務(wù)
*
* @param redisTemplate
* @param factory
*/
private void initDomainRedisTemplate(@Qualifier("RedisTemplateS") RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
// 如果不配置Serializer,那么存儲(chǔ)的時(shí)候缺省使用String,如果用User類型存儲(chǔ),那么會(huì)提示錯(cuò)誤User can't cast to
// String!
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<Object>(Object.class);
redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
redisTemplate.setValueSerializer(fastJsonRedisSerializer);
//redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
//redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
// 開(kāi)啟事務(wù)
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.setConnectionFactory(factory);
}
/**
* 注入封裝RedisTemplate @Title: redisUtil @return RedisUtil @date
*
*/
@Bean(name = "redisUtils")
public RedisUtils redisUtil(@Qualifier("RedisTemplateS") RedisTemplate<String, Object> redisTemplate) {
RedisUtils redisUtil = new RedisUtils();
redisUtil.setRedisTemplate(redisTemplate);
return redisUtil;
}
四.編寫(xiě)RedisUtil消息發(fā)布方法
public class RedisUtils {
private static final Logger log = LoggerFactory.getLogger(RedisUtils.class);
private RedisTemplate<String, Object> redisTemplate;
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void publish(String channal ,Object obj) {
redisTemplate.convertAndSend(channal,obj );
}
}
五.配置消息監(jiān)聽(tīng)
@Configuration
public class RedisMessageListener {
/**
* 創(chuàng)建連接工廠
* @param connectionFactory
* @param listenerAdapter
* @return
*/
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter,MessageListenerAdapter listenerAdapter2){
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//接受消息的key
container.addMessageListener(listenerAdapter,new PatternTopic("phone"));
return container;
}
/**
* 綁定消息監(jiān)聽(tīng)者和接收監(jiān)聽(tīng)的方法
* @param receiver
* @return
*/
@Bean
public MessageListenerAdapter listenerAdapter(ReceiverRedisMessage receiver){
return new MessageListenerAdapter(receiver,"receiveMessage");
}
/**
* 注冊(cè)訂閱者
* @param latch
* @return
*/
@Bean
ReceiverRedisMessage receiver(CountDownLatch latch) {
return new ReceiverRedisMessage(latch);
}
/**
* 計(jì)數(shù)器,用來(lái)控制線程
* @return
*/
@Bean
public CountDownLatch latch(){
return new CountDownLatch(1);//指定了計(jì)數(shù)的次數(shù) 1
}
}
六.消息訂閱方法
public class ReceiverRedisMessage {
private static final Logger log = LoggerFactory.getLogger(ReceiverRedisMessage.class);
private CountDownLatch latch;
@Autowired
public ReceiverRedisMessage(CountDownLatch latch) {
this.latch = latch;
}
/**
* 隊(duì)列消息接收方法
*
* @param jsonMsg
*/
public void receiveMessage(String jsonMsg) {
log.info("[開(kāi)始消費(fèi)REDIS消息隊(duì)列phone數(shù)據(jù)...]");
try {
log.info("監(jiān)聽(tīng)者收到消息:{}", jsonMsg);
JSONObject exJson = JSONObject.parseObject(jsonMsg);
User user = JSON.toJavaObject(exJson, User.class);
System.out.println("轉(zhuǎn)化為對(duì)象 :"+user);
log.info("[消費(fèi)REDIS消息隊(duì)列phone數(shù)據(jù)成功.]");
} catch (Exception e) {
log.error("[消費(fèi)REDIS消息隊(duì)列phone數(shù)據(jù)失敗,失敗信息:{}]", e.getMessage());
}
latch.countDown();
}
}
七.定時(shí)消息發(fā)布測(cè)試
@EnableScheduling
@Component
public class PublisherController {
private static final Logger log = LoggerFactory.getLogger(PublisherController.class);
@Autowired
private RedisUtils redisUtils;
@Scheduled(fixedRate = 5000)
public String pubMsg() {
User user=new User(1, "尚***", 26,"男","陜西省xxxx市xxxxxx縣");
redisUtils.publish("phone", user);
log.info("Publisher sendes Topic... ");
return "success";
}
}
八.測(cè)試結(jié)果

九.發(fā)布對(duì)象User實(shí)體
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private int id;
private String name;
private int age;
private String sex;
private String address;
.....................
}
到此這篇關(guān)于Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱的文章就介紹到這了,更多相關(guān)Spring boot redis消息發(fā)布與訂閱內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
redis調(diào)用二維碼時(shí)的不斷刷新排查分析
這篇文章主要為大家介紹了redis調(diào)用二維碼時(shí)不斷刷新排查分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
Redis中key過(guò)期策略的實(shí)現(xiàn)
Key的過(guò)期機(jī)制是Redis保持高可用性的重要策略,過(guò)期策略分為惰性過(guò)期和定期過(guò)期,惰性過(guò)期在每次訪問(wèn)key時(shí)檢查是否過(guò)期,定期過(guò)期則由serverCron方法定時(shí)清理過(guò)期key,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下2024-09-09
Redis遍歷海量數(shù)據(jù)集的幾種實(shí)現(xiàn)方法
Redis作為一個(gè)高性能的鍵值存儲(chǔ)數(shù)據(jù)庫(kù),廣泛應(yīng)用于各種場(chǎng)景,包括緩存、消息隊(duì)列、排行榜,本文主要介紹了Redis遍歷海量數(shù)據(jù)集的幾種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
Redis存儲(chǔ)的列表分頁(yè)和檢索的實(shí)現(xiàn)方法
在 Redis 中,列表(List)是一種有序的數(shù)據(jù)結(jié)構(gòu),通常用于存儲(chǔ)一系列元素,由于列表是有序的,可以通過(guò)索引來(lái)訪問(wèn)元素,因此可以很方便地實(shí)現(xiàn)分頁(yè)和檢索功能,以下是 Redis 列表的分頁(yè)和檢索的實(shí)現(xiàn)方法,需要的朋友可以參考下2025-02-02

