在实际的业务场景中,我们需要监听redis中某些特定失效的key,基于此事件做一些特殊的逻辑处理,比如日志数据清理,MQ数据同步等等。一般可以按照如下思路实现
在Spring Data Redis中,KeyExpirationEventMessageListener 是一个接口,而不是一个具体实现。这个接口是为了让你实现一个监听器,它可以处理键过期事件。在上述代码中,我们使用了MessageListenerAdapter来包装KeyExpirationEventListener,以便于将onMessage方法转换为Redis消息监听器。MessageListenerAdapter是Spring Data Redis提供的一个工具类,它可以将任何对象转换为MessageListener,并调用对象的方法来处理消息。
如果你想直接使用KeyExpirationEventMessageListener,你需要创建一个类实现这个接口,并在RedisMessageListenerContainer中使用这个类。以下是使用KeyExpirationEventMessageListener的示例:
具体代码如下所示:
package com.znlh.cust.saas.order.receiver.device.expire.other;
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.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
/**
* <p>Title: RedisListenerConfig</p>
* <p>Description: </p>
*
* @author Jeff
* @version V1.0
* @date 2021/5/10 10:26
* <p>Copyright: Copyright (c) 2020 版权</p>
*/
@Configuration
public class RedisListenerConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
// 事件以__keyevent@<db>__为前缀进行发布
container.addMessageListener(new RedisKeyExpirationListener(container), new PatternTopic("__keyevent@0__" +
":expired"));
return container;
}
}
package com.znlh.cust.saas.order.receiver.device.expire.other;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
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;
/**
-
Title: RedisKeyExpirationListener
-
Description:
- 该监听器监听的是所有库的key事件
- keyevent@*:expired
- @author Jeff
- @version V1.0
- @date 2021/5/10 10:27
-
Copyright: Copyright (c) 2020 版权
*/
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
public void onMessage(Message message, byte[] pattern) {
// 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
String expiredKey = message.toString();
log.info("失效expiredKey:{}", expiredKey);
}
}