用途:可用于解决轻量级消息投送和消费,尤其是已有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要一样

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐