欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱的代碼

 更新時(shí)間:2020年04月27日 09:42:34   作者:源碼分析  
這篇文章主要介紹了Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值需要的朋友可以參考下

一.創(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恢復(fù)被移除集群的服務(wù)器實(shí)操步驟

    Redis恢復(fù)被移除集群的服務(wù)器實(shí)操步驟

    這篇文章主要為大家介紹了Redis恢復(fù)被移除集群的服務(wù)器實(shí)操步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • mac下redis安裝、設(shè)置、啟動(dòng)停止方法詳解

    mac下redis安裝、設(shè)置、啟動(dòng)停止方法詳解

    這篇文章主要介紹了mac下redis安裝、設(shè)置、啟動(dòng)停止方法詳解,需要的朋友可以參考下
    2020-02-02
  • 如何利用 Redis 實(shí)現(xiàn)接口頻次限制

    如何利用 Redis 實(shí)現(xiàn)接口頻次限制

    這篇文章主要介紹了如何利用 Redis 實(shí)現(xiàn)接口頻次限制,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Redis+攔截器實(shí)現(xiàn)接口防刷

    Redis+攔截器實(shí)現(xiàn)接口防刷

    接口防刷有很多種實(shí)現(xiàn)思路,例如:攔截器/AOP+Redis、攔截器/AOP+本地緩存、前端限制等等很多種實(shí)現(xiàn)思路,本文主要來(lái)講一下?攔截器+Redis?的實(shí)現(xiàn)方式,需要的可以參考下
    2023-08-08
  • 一文搞懂Redis最常用String字符串技能

    一文搞懂Redis最常用String字符串技能

    想要一文搞懂Redis最常用字符串技能?你來(lái)對(duì)地方了,這篇指南將帶你深入淺出,輕松掌握Redis字符串的強(qiáng)大功能,別眨眼,跟我們一起,讓數(shù)據(jù)操作變得前所未有的簡(jiǎn)單,需要的朋友可以參考下
    2024-03-03
  • Redis緩存異常常用解決方案總結(jié)

    Redis緩存異常常用解決方案總結(jié)

    Redis緩存異常問(wèn)題分別是緩存雪崩,緩存預(yù)熱,緩存穿透,緩存降級(jí),緩存擊穿,本文主要介紹了Redis緩存異常常用解決方案總結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Redis bitmap 實(shí)現(xiàn)簽到案例(最新推薦)

    Redis bitmap 實(shí)現(xiàn)簽到案例(最新推薦)

    這篇文章主要介紹了Redis bitmap 實(shí)現(xiàn)簽到案例,通過(guò)設(shè)計(jì)簽到功能對(duì)應(yīng)的數(shù)據(jù)庫(kù)表,結(jié)合sql語(yǔ)句給大家講解的非常詳細(xì),具體示例代碼跟隨小編一起看看吧
    2024-07-07
  • 使用Redis解決高并發(fā)方案及思路解讀

    使用Redis解決高并發(fā)方案及思路解讀

    這篇文章主要介紹了使用Redis解決高并發(fā)方案及思路,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Redis協(xié)議具體用法詳解

    Redis協(xié)議具體用法詳解

    在本篇文章中小編給大家整理了關(guān)于Redis協(xié)議具體用法以及相關(guān)內(nèi)容知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-06-06
  • Redis Cluster集群數(shù)據(jù)分片機(jī)制原理

    Redis Cluster集群數(shù)據(jù)分片機(jī)制原理

    這篇文章主要介紹了Redis Cluster集群數(shù)據(jù)分片機(jī)制原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論