springBoot项目监听redis中间件key变化
import org.springframework.beans.factory.annotation.Autowired;
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.RedisMessageListenerContainer;
/**
* @version 1.0
* @date 2022/5/24 13:27
* @since : JDK 11
*/
@Configuration
public class RedisConfig {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer() {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(redisConnectionFactory);
return container;
}
@Bean
public RedisKeyChangeListener redisKeyChangeListener() {
RedisKeyChangeListener listener = new RedisKeyChangeListener(redisMessageListenerContainer(), "");
return listener;
}
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.Topic;
import org.springframework.util.StringUtils;
import java.nio.charset.StandardCharsets;
import java.util.Properties;
/**
* @version 1.0
* @date 2022/5/24 13:19
* @since : JDK 11
*/
@Slf4j
public class RedisKeyChangeListener implements MessageListener {
/**
* 指定监听redis的键的变化
*/
private final String listenerKeyName;
/**
* 监听所有redis键的变化
*/
private static final Topic TOPIC_ALL_KEYEVENTS = new PatternTopic("__keyevent@*");
/**
* 指定监听redis所有键的set操作
*/
private static final Topic TOPIC_KEYEVENTS_SET = new PatternTopic("__keyevent@0__:set");
/**
* 以正则模式监听所有匹配到的所有键的变化
*/
private static final Topic TOPIC_KEYNAMESPACE_NAME = new PatternTopic("__keyspace@0__:myKey*");
private String keyspaceNotificationsConfigParameter = "KEA";
public RedisKeyChangeListener(RedisMessageListenerContainer listenerContainer, String listenerKeyName) {
this.listenerKeyName = listenerKeyName;
initAndSetRedisConfig(listenerContainer);
}
public void initAndSetRedisConfig(RedisMessageListenerContainer listenerContainer) {
if (StringUtils.hasText(keyspaceNotificationsConfigParameter)) {
RedisConnection connection = listenerContainer.getConnectionFactory().getConnection();
try {
Properties config = connection.getConfig("notify-keyspace-events");
if (!StringUtils.hasText(config.getProperty("notify-keyspace-events"))) {
connection.setConfig("notify-keyspace-events", keyspaceNotificationsConfigParameter);
}
} finally {
connection.close();
}
}
listenerContainer.addMessageListener(this, TOPIC_KEYNAMESPACE_NAME);
}
@Override
public void onMessage(Message message, byte[] pattern) {
log.info("key发生变化类型:[ {} ],key监听正则:[ {} ],变化key:[ {} ]", message, new String(pattern, StandardCharsets.UTF_8), new String(message.getChannel(), StandardCharsets.UTF_8));
}
}
参考:
redis中文文档相关章节
redis官方文档相关章节
SpringBoot:监控Redis中的某个Key的变化(自定义监听器)