Истек срок действия ключевого триггера - Spring data Redis

Я пытаюсь настроить обработчик событий истечения срока действия ключа, используя redis для данных Spring, но не могу заставить его работать. Я провел небольшое исследование, но не дал ожидаемых результатов. Не уверен, что мне не хватает. Я хочу ЗАПИСАТЬ сообщение, когда истечет срок действия ключа в кеше Redis.

@Configuration
@EnableRedisRepositories
public class RedisConfig {

    @Bean 
    StringRedisTemplate stringRedisTemplate(){
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(jedisConnectionFactory());
        return stringRedisTemplate;
    }

    @Bean
    RedisMessageListenerContainer redisContainer() {
        RedisMessageListenerContainer container 
          = new RedisMessageListenerContainer(); 
        container.setConnectionFactory(jedisConnectionFactory()); 
        container.addMessageListener(messageListener(), topic()); 
        return container; 
    }

    @Bean
    MessageListenerAdapter messageListener() { 
        return new MessageListenerAdapter(new RedisMessageSubscriber());
    }

    @Bean
    MessagePublisher redisPublisher() { 
        return new RedisMessagePublisher();
    }

    @Bean
    ChannelTopic topic() {
        return new ChannelTopic("messageQueue");
    }
}


public interface MessagePublisher {
    void publish(String message);
}

public class RedisMessagePublisher implements MessagePublisher {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private ChannelTopic topic;

    public void publish(String message) {
        stringRedisTemplate.convertAndSend(topic.getTopic(), message);
    }
}

@Service
public class RedisMessageSubscriber implements MessageListener {

    private static final Logger LOG = Logger.getLogger(RedisMessageSubscriber.class);

    public static List<String> messageList = new ArrayList<String>();

    @Override
    public void onMessage(Message message, byte[] pattern) {
        messageList.add(message.toString());
    }

}

Может кто поможет? Спасибо


person tindu edward    schedule 29.03.2018    source источник


Ответы (1)


Во-первых, необходимо включить уведомление о пространстве ключей для события истечения срока действия в Redis. По умолчанию уведомления о событиях в пространстве клавиш отключены, потому что эта функция, хотя и не очень разумна, использует некоторую мощность процессора. Уведомления включаются с помощью события notify-keyspace-events в redis.conf или через CONFIG SET.

notify-keyspace-events "Ex"

Когда вы закончите с redis, вам нужно настроить прослушиватель сообщений с шаблоном темы "__keyevent@*__:expired". Вот пример кода.

Класс слушателя:

@Component
public class ExpirationListener implements MessageListener {
    private static final Logger logger = LoggerFactory.getLogger(ExpirationListener.class);

    @Override
    public void onMessage(Message message, byte[] bytes) {
        String key = new String(message.getBody());
        logger.debug("expired key: {}", key);
    }
}

Конфигурация:

@Bean
RedisMessageListenerContainer keyExpirationListenerContainer(RedisConnectionFactory connectionFactory, ExpirationListener expirationListener) {
    RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();
    listenerContainer.setConnectionFactory(connectionFactory);
    listenerContainer.addMessageListener(expirationListener, new PatternTopic("__keyevent@*__:expired"));
    listenerContainer.setErrorHandler(e -> logger.error("There was an error in redis key expiration listener container", e));
    return listenerContainer;
}
person Monzurul Haque Shimul    schedule 30.03.2018
comment
можно ли получить само сообщение, а не только ключ? - person Samet Baskıcı; 21.05.2021
comment
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP) включает события пространства ключей без необходимости возиться с консолью Redis или файлом конфигурации. - person Abhijit Sarkar; 07.07.2021