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
在自己的线程上运行所有通知。
我想用 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
在自己的线程上运行所有通知。