Spring data redis - 监听过期事件

Spring data redis - listen to expiration event

我想用 KeyExpirationEventMessageListener 监听过期事件,但找不到示例。

有人知道如何使用 Spring boot 1.4.3 & Spring Data Redis 吗?

我目前正在做这个

    JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");
    this.jedis = pool.getResource();
    this.jedis.psubscribe(new JedisPubSub() {
        @Override
        public void onPMessage(String pattern, String channel, String message) {
            System.out.println("onPMessage pattern " + pattern + " " + channel + " " + message);
            List<Object> txResults = redisTemplate.execute(new SessionCallback<List<Object>>() {
                public List<Object> execute(RedisOperations operations) throws DataAccessException {
                    operations.multi();
                    operations.opsForValue().get("val:" + message);
                    operations.delete("val:" + message);
                    return operations.exec();
                }
            });
            System.out.println(txResults.get(0));
        }
    }, "__keyevent@0__:expired");

而且我想直接使用Spring而不是Jedis。

此致

不要使用 KeyExpirationEventMessageListener,因为它会触发 RedisKeyExpiredEvent,然后导致 RedisKeyValueAdapter.onApplicationEvent 失败。

而是使用 RedisMessageListenerContainer:

@Bean
RedisMessageListenerContainer keyExpirationListenerContainer(RedisConnectionFactory connectionFactory) {

    RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();
    listenerContainer.setConnectionFactory(connectionFactory);

    listenerContainer.addMessageListener((message, pattern) -> {

        // event handling comes here

    }, new PatternTopic("__keyevent@*__:expired"));

    return listenerContainer;
}

RedisMessageListenerContainer 在自己的线程上运行所有通知。