02 redis發布訂閱模式缺點(spring-redis 發布訂閱模式:發布一條消息收到了兩條,重復監聽)

时间:2024-05-13 14:05:30 编辑: 来源:

文算是Redis哨兵的一個入門文章,主要講了哨兵的作用,例如監控、選主和通知。

在Redis讀寫分離的情況下,使用哨兵可以很輕松地做到故障恢復,提升了整體的可用性。

但哨兵無法解決Redis單機寫的瓶頸,這就需要引入集群模式,相應的文章也被列為明年的寫作計劃中。

</article>

Spring Boot使用Redis進行消息的發布訂閱 原創

/

**

* Redis 相關的配置,包含推送,以及對象編碼的定義

*/

@Configuration

public class RedisConfig {

public @Bean

RedisTemplate redisTemplate(RedisConnectionFactory 買粉絲nnectionFactory) {

RedisTemplate template = new RedisTemplate>();

template.setConnectionFactory(買粉絲nnectionFactory);

template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());

template.setKeySerializer(new StringRedisSerializer());

template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());

template.setValueSerializer(new GenericJackson2JsonRedisSerializer());

return template;

}

@Bean

ChannelTopic topic() {

return new ChannelTopic("messageQueue");

}

@Bean

RedisMessageListenerContainer 買粉絲ntainer(RedisConnectionFactory 買粉絲nnectionFactory,

MessageListenerAdapter listenerAdapter) {

RedisMessageListenerContainer 買粉絲ntainer = new RedisMessageListenerContainer();

買粉絲ntainer.setConnectionFactory(買粉絲nnectionFactory);

買粉絲ntainer.addMessageListener(listenerAdapter, new PatternTopic("messageQueue"));

return 買粉絲ntainer;

}

@Bean

MessageListenerAdapter listenerAdapter(Receiver receiver) {

return new MessageListenerAdapter(receiver, "receiveMessage");

}

}

public enum BusinessTypeEnum {

//修改SystemConfig緩存

UPDATE_SYSTEM_CONFIG;

}

//發布者接口

public interface MessagePublisher {

void publish(String message);

}

@Component

public class RedisMessagePublisher implements MessagePublisher{

private final static Logger logger = LoggerFactory.getLogger(RedisMessagePublisher.class);

@Autowired

private RedisTemplate redisTemplate;

@Autowired

private ChannelTopic topic;

@Override

public void publish(String message) {

logger.info("推送信息:"+message);

redisTemplate.買粉絲nvertAndSend(topic.getTopic(), message);

}

}

public interface Receiver { void receiveMessage(String message); }

@Component

public class MessageReceiver implements Receiver {

private final static Logger logger = LoggerFactory.getLogger(MessageReceiver.class);

@Autowired

private ISystemConfigService systemConfigService;

@Override

public void receiveMessage(String message) {

logger.info("消息接收:"+message);

JSONObject object = JSONObject.parseObject(message);

String businessType = object.getString("businessType");

logger.info("處理業務類型:businessType="+businessType);

if(BusinessTypeEnum.UPDATE_SYSTEM_CONFIG.toString().equals(businessType)){ //處理SystemConfig緩存

String jsonStr = object.getString("jsonStr");

if(jsonStr!=null&&!"".equals(jsonStr)){

JSONObject json = JSONObject.parseObject(object.getString("jsonStr"));

for(String key:json.keySet()){

String value = json.getString(key);

SystemConfig systemConfig = SystemConfigContainer.instance().getSystemConfig(key);

if(systemConfig!=null){

systemConfig.setKeyValue(value);

SystemConfigContainer.instance().uptSystemConfig(systemConfig);

}else{

systemConfig = systemConfigService.selectByPrimaryJianMing(key);

systemConfig.setKeyValue(value);

SystemConfigContainer.instance().uptSystemConfig(systemConfig);

}

}

}

}

}

}

搜索关键词: