美文网首页
spring boot 配置redis的监听器

spring boot 配置redis的监听器

作者: 周六不算加班 | 来源:发表于2018-07-05 11:30 被阅读214次

    1、redis配置文件redis.windows.conf设置
    找到notify-keyspace-events配置,初始化为"",改为Ex。这样可以监听key值过期的事件。

    2、spring boot配置文件

    redis配置

    spring.redis.host=127.0.0.1
    spring.redis.port=6379
    spring.redis.jedis.pool.max-active= 100
    spring.redis.jedis.pool.max-idle=10
    spring.redis.jedis.pool.min-idle=10
    spring.redis.jedis.pool.max-wait=100
    spring.redis.timeout=500
    spring.redis.database=0
    spring.redis.topic=keyevent@0:expired

    3、代码配置
    @Configuration
    @EnableCaching
    public class RedisConfig extends CachingConfigurerSupport {

    /**
     * 生成key的策略
     * @return
     */
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
    
    /**
     * 采用RedisCacheManager作为缓存管理器
     * @param connectionFactory
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        RedisCacheManager redisCacheManager = RedisCacheManager.create(connectionFactory);
        return  redisCacheManager;
    }
    
    /**
     * RedisTemplate配置
     */
    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate template = new StringRedisTemplate(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
    

    //==================================================监听事件配置======================================================//
    /**
    * redis消息监听器容器
    * 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,该消息监听器
    * 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
    * @param connectionFactory
    * @param listenerAdapter
    * @return
    */
    @Bean //相当于xml中的bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
    MessageListenerAdapter listenerAdapter1,MessageListenerAdapter listenerAdapter2) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //订阅了一个叫chat 的通道
        container.addMessageListener(listenerAdapter1, new PatternTopic("chat"));
        //监听key值失效的状态
        container.addMessageListener(listenerAdapter2, new PatternTopic("__keyevent@0__:expired"));
        //这个container 可以添加多个 messageListener
        return container;
    }
    
    /**
     * 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
     * @param receiver
     * @return
     */
    @Bean
    MessageListenerAdapter listenerAdapter1(MessageReceiver receiver) {
        //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器,利用反射的方法调用“receiveMessage”
        //也有好几个重载方法,这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }
    
    @Bean
    MessageListenerAdapter listenerAdapter2(MessageReceiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage2");
    }
    
    /**redis 读取内容的template */
    /**
     * StringRedisTemplate继承了RedisTemplate方法,只能配置一个,我目前留下的是RedisTemplate
     */
    

    // @Bean
    // StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
    // return new StringRedisTemplate(connectionFactory);
    // }

    }
    4、消息处理方法
    @Component
    public class MessageReceiver {
    /*接收定时器消息的方法/
    public void receiveMessage(String message){
    System.out.println("收到一条消息1:"+message);
    }

    /**接收key值监听消息的方法*/
    public void receiveMessage2(String message){
        System.out.println("收到一条消息2:"+message);
    }
    

    }

    5、定时任务,发送消息
    @Component
    public class TestTimer {

    @Autowired
    StringRedisTemplate  stringRedisTemplate;
    
    /**
     * 定时任务测试
     */
    //@Scheduled(cron = "0/1 * * * * ?")
    private void test() {
        System.out.println("执行定时任务的时间是:"+new Date());
    }
    
    /**
     * 监听事件定时任务
     */
    @Scheduled(cron = "0/5 * * * * ?")
    private void sendMessage() {
        System.out.println("执行定时任务的时间是:"+new Date());
        Date d = new Date();
        stringRedisTemplate.convertAndSend("chat", d.toString());
    }
    

    }

    6、自行设置一个key值,就可以看到key失效时出发的处理方法了。key值监听可以用来作为订单过期的处理方法,避免了定时任务,提高准确性。

    相关文章

      网友评论

          本文标题:spring boot 配置redis的监听器

          本文链接:https://www.haomeiwen.com/subject/yenuuftx.html