1.*配置监听器
@Configuration
public class RedisListenerConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
// HashMap<String, MessageListener> objectObjectHashMap = new HashMap<>();
PatternTopic channelTopic = new PatternTopic("__keyevent@12__:expired");
container.setConnectionFactory(connectionFactory);
RedisKeyExpirationListener listener = new RedisKeyExpirationListener();
container.addMessageListener(listener, channelTopic);
return container;
}
}
2监听所有db的过期事件__keyevent@*__:expired"
/**
* 监听所有db的过期事件__keyevent@*__:expired"
*/
@Component
public class RedisKeyExpirationListener implements MessageListener {
private static final Logger LOGGER = LoggerFactory.getLogger(RedisKeyExpirationListener.class);
@Autowired
RedisLocker redisLocker;
/**
* 针对 redis 数据失效事件,进行数据处理
*
* @param message
* @param pattern
*/
@Override
public void onMessage(Message message, byte[] pattern) {
// 获取到失效的 key,进行取消订单业务处理
String channel = new String(message.getChannel(), StandardCharsets.UTF_8);
if ("__keyevent@12__:expired".equals(channel)) {
// String expiredKey = message.toString();RedisMessageListenerContainer
String key = new String(message.getBody(), StandardCharsets.UTF_8);
try {
//redis分布式锁
redisLocker.lock(key, () -> {
LOGGER.info("redis key 过期:pattern={},channel={},key={}", new String(pattern), channel, key);
// 执行逻辑
return null;
});
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(key);
}
}
}