springboot项目中redis channel 的使用
springboot项目中redis channel 的使用
·
用途:可用于解决轻量级消息投送和消费,尤其是已有redis的使用的情况下,尤其是分布式环境中,同时改变多个client的某个属性值,或者同时行使某个动作,从而实现同步多客户端属性值
用法:
发送端:
发送请求
@RequestMapping("/sendMsg")
public String sendMsg(@RequestParam("productId") Long productId){
//模拟先设置了某个状态
localCache.setLocalCache("miaosha:stock:cache:" + productId,true);
//分布式环境下,每个本地缓存都要清除缓存状态,向redis channel 发送
redisTemplate.convertAndSend("testChannnel",productId);
return "suucess";
}
接收端
监控channel
一 实现MessageListener接口
@Slf4j
public class RedisChannelListener implements MessageListener {
//这个是谷歌的guaua缓存
@Autowired
private LocalCache localCache;
@Override
public void onMessage(Message message, byte[] bytes) {
String productId = new String(message.getBody(), StandardCharsets.UTF_8);
log.info("清除memberId:{}的本地缓存设置为空");
localCache.remove("miaosha:stock:cache:" + productId);
}
}
二 配置监控
@Configuration
public class RedisConfig {
@Autowired
private RedisConnectionFactory connectionFactory;
//这个是对RedisTemplate存储做一个格式化
@Bean
@Primary
public RedisTemplate<String,Object> redisTemplate(){
RedisTemplate<String,Object> template = new RedisTemplate();
template.setConnectionFactory(connectionFactory);
// 序列化工具
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);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(){
RedisMessageListenerContainer container=new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(redismessageListener(),redisChannelTopic());
return container;
}
@Bean
public MessageListener redismessageListener(){
return new RedisChannelListener();
}
@Bean
public Topic redisChannelTopic(){
return new ChannelTopic("testChannnel");
}
}
结语:监听redis的channel,当有消息时,触发onMessage方法即可让多个同一微服务做相同的事,从而达到同步的作用
注意:发送时channel的topic和监听配置处的topic的name要一样
更多推荐
已为社区贡献2条内容
所有评论(0)