Redis-监听过期key-JAVA实现方案

一、创建监听配置类  RedisListenerConfig。



import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;

@Configuration
public class RedisListenerConfig {

    @Bean
    RedisMessageListenerContainer listenerContainer(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();
        listenerContainer.setConnectionFactory(connectionFactory);
        return listenerContainer;
    }

    @Bean
    KeyExpirationEventMessageListener redisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        return new RedisKeyExpirationListener(listenerContainer);
    }

}

二、 创建监听器: RedisKeyExpirationListener 继承  KeyExpirationEventMessageListener .

这里只能获取到 过期的key,无法获取过期的value. 


import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {


    @Autowired
    RedisTemplate redisTemplate ;

    /**
     * Creates new {@link } for {@code __keyevent@*__:expired} messages.
     *
     * @param listenerContainer must not be {@literal null}.
     */
    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    /**
     * 针对redis数据失效事件,进行数据处理
     *
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        //获得失效的key
        System.out.println("onMessage pattern " + pattern + " " + " " + message);
        String channel = new String(message.getChannel());
        System.out.println(channel);
    }

}

三: 设置redis的配置文件redis.config中的  notify-keyspace-events 为 Ex 

四、验证一下:

          在redis客户端执行:setex localhost:1>key 5 value 设置一个过期的key

Redis-监听过期key-JAVA实现方案_第1张图片

          观察idea控制台:发现打印了过期的key,成功监听到过期的数据。

Redis-监听过期key-JAVA实现方案_第2张图片

参考博客:  

你可能感兴趣的:(Java,redis)