Spring Data Redis - 监听过期事件

6

我想使用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。

祝好

1个回答

7
不要使用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 在独立的线程中运行所有通知。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接