【问题标题】:How to listen for keyspace notifications of redis cluster in java using jedis client?java - 如何使用jedis客户端监听redis集群的keyspace通知?
【发布时间】:2019-08-29 13:06:45
【问题描述】:

我正在设置一个服务器,它可以监听和发送有关 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(new KeyListenerCluster(), "keyevent@0:*");

我可以在使用 redis-cluster 时执行所有其他操作,但不能做一件事。

cluster.configSet("notify-keyspace-events", "AKE");// 适用于所有类型的事件 cluster.psubscribe(new KeyListenerCluster(), "keyevent@0:*");

【问题讨论】:

    标签: redis jedis redis-cluster


    【解决方案1】:

    我面临同样的问题,Keyspace 通知间歇性地工作(10 次中有 6 或 7 次工作)。我读到需要订阅所有主节点才能获得通知。如果有帮助,我将我的配置文件粘贴在下面:

    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;
        }
    

    【讨论】:

      猜你喜欢
      • 2021-03-31
      • 2022-11-26
      • 2015-11-24
      • 1970-01-01
      • 2022-01-15
      • 2019-12-01
      • 2015-10-13
      • 2016-12-10
      • 2023-03-03
      相关资源
      最近更新 更多