Я устанавливаю сервер, который может прослушивать и отправлять сообщения о любом событии, происходящем в базе данных Redis. Мне удалось получить уведомление о новых событиях для хоста и порта Redis, но я не могу сделать это для кластера Redis.
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
config.setMaxTotal(30);
config.setMaxWaitMillis(2000);
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
jedisClusterNode.add(new HostAndPort("127.0.0.1", 7001));
JedisCluster cluster1 = new JedisCluster(jedisClusterNode, config);
String redisProperties = cluster1.getClusterNodes().toString().replaceAll("[{}]", "");
Set<HostAndPort> nodes = new HashSet<>();
String[] mainArray = redisProperties.split(",");
for (int i = 0; i < mainArray.length; i++) {
String[] equalArray = mainArray[i].split(" = ");
String mainData = equalArray[0];
String[] ipPortPair = mainData.split(":");
nodes.add(new HostAndPort(ipPortPair[0].trim(), Integer.valueOf(ipPortPair[1].trim())));
}
JedisCluster cluster = new JedisCluster(nodes, 10000, 1000, 1, config);
jedis.configSet("notify-keyspace-events", "AKE");// Для всех видов событий jedis.psubscribe(новый KeyListenerCluster(), "ключевое событие@0:*");
Я могу выполнять любую другую операцию с использованием redis-кластера, но не могу сделать одну вещь.
cluster.configSet("notify-keyspace-events", "AKE");// Для всех видов событий cluster.psubscribe(новый KeyListenerCluster(), "ключевое событие@0:*");
Я столкнулся с той же проблемой, уведомление Keyspace работает с перебоями (работает 6 или 7 раз из 10). Я читал, что нужно подписаться на все главные узлы, чтобы получать уведомления. Если это поможет, я вставил свой файл конфигурации ниже:
KeySpaceNotificationMessageListener keySpaceNotificationMessageListener;
@Value("${spring.redis.cluster.nodes}")
private String hostsAndPorts;
@Bean
JedisConnectionFactory jedisConnectionFactory(RedisClusterConfiguration redisClusterConfiguration)
{
return new JedisConnectionFactory(redisClusterConfiguration);
}
@Bean
MessageListenerAdapter messageListener() {
return new MessageListenerAdapter(keySpaceNotificationMessageListener);
}
@Bean(name = "cacheManager1")
@Primary
public RedisCacheManager redisCacheManager1()
{
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.disableCachingNullValues()
.entryTtl(Duration.ofMinutes(1))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));
redisCacheConfiguration.usePrefix();
return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(jedisConnectionFactory(redisClusterConfiguration()))
.cacheDefaults(redisCacheConfiguration).build();
}
@Bean(name = "cacheManager2")
public RedisCacheManager redisCacheManager2( JedisConnectionFactory jedisConnectionFactory)
{
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.disableCachingNullValues()
.entryTtl(Duration.ofDays(1))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));
redisCacheConfiguration.usePrefix();
return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(jedisConnectionFactory(redisClusterConfiguration()))
.cacheDefaults(redisCacheConfiguration).build();
}
@Bean
public RedisClusterConfiguration redisClusterConfiguration()
{
String [] redisHostAndPorts = hostsAndPorts.split(",");
System.out.println(Arrays.toString(redisHostAndPorts));
RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(Arrays.asList(redisHostAndPorts));
return redisClusterConfiguration;
}
@Bean
RedisMessageListenerContainer redisContainer() {
final RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(jedisConnectionFactory(redisClusterConfiguration()));
container.addMessageListener(messageListener(), new PatternTopic("__keyspace@*:*"));
container.setTaskExecutor(Executors.newFixedThreadPool(4));
return container;
}
public void setKeySpaceNotificationMessageListener(KeySpaceNotificationMessageListener keySpaceNotificationMessageListener)
{
this.keySpaceNotificationMessageListener = keySpaceNotificationMessageListener;
}