簡體   English   中英

如何使用Jedis Client監聽Java中Redis集群的鍵空間通知?

[英]How to listen for keyspace notifications of redis cluster in java using jedis client?

我正在設置一個服務器,該服務器可以偵聽和發送有關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 :*”);

我遇到了同樣的問題,鍵空間通知間歇性地工作(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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM