sql >> データベース >  >> NoSQL >> Redis

jedisを使用してredisクラスター内の特定のスロット/ノードに書き込む方法

    ソリューション1:
    キーが入るスロットを特定するための解決策を見つけました。 JedisClusterには、それを取得するためのAPIがいくつかあります。

    int slotNum = JedisClusterCRC16.getSlot(key); -キーのスロット番号を提供します。

    Set<HostAndPort> redisClusterNode = new HashSet<HostAndPort>();
    redisClusterNode.add(new HostAndPort(hostItem, port));
    
    JedisSlotBasedConnectionHandler connHandler = new 
                  JedisSlotBasedConnectionHandler(redisClusterNode, poolConfig, 60);
    
    Jedis jedis = connHandler.getConnectionFromSlot(slotNum);
    

    これにより、クラスター内の特定のノードに(内部的にJedispoolからの)jedisオブジェクトが提供されます。
    これで、上記のjedisオブジェクトを使用して、すべてのコマンドを特定のノード(クラスター内)に簡単にパイプライン処理できます

    Pipeline pipeline = jedis.pipelined();
    pipeline.multi();
    for(Entry<String, Map<String, String>> kvf : kvfs.entrySet()) {
       pipeline.hmset(kvf.getKey(), kvf.getValue());
    }
    pipeline.exec();
    

    このアプローチ(JedisClusterを使用)では、キーが接続される適切なノードが提供されましたが、期待されるパフォーマンスは得られませんでしたが、スロット番号と(スロットの)ノードを知るための手順が原因だと思います。
    上記の手順は、スロット番号を含む実際のノード(jedis)を取得しようとするたびに、(クラスター内の)ノードへの物理接続を確立するようです。したがって、これは、数百万のキーがある場合のパフォーマンスを妨げます。
    したがって、レタスパッケージを使用した別のアプローチ(以下)は、これを克服するのに役立ちました。

    ソリューション2:
    クラスターモードでのコマンドのバッチの送信をサポートするレタスパッケージを使用しました。

         <groupId>biz.paluch.redis</groupId>
         <artifactId>lettuce</artifactId>
         <version>4.4.3.Final</version>
    

    コードスニペット:

    RedisClusterClient client = RedisClusterClient.create(RedisURI.create("hostname", "port"));
    StatefulRedisClusterConnection<String, String> connection = client.connect();
    
    RedisAdvancedClusterAsyncCommands<String, String> commands = connection.async();
    // Disabling auto-flushing
    commands.setAutoFlushCommands(false);
    
    List<RedisFuture<?>> futures = new ArrayList<>();
    // kvf is of type Map<String, Map<String, String>>
    for (Entry<> e : kvf.entrySet())
    {
       futures.add(commands.hmset( (String) e.getKey(), (Map<String, String>) e.getValue()));
    }
    // write all commands to the transport layer
    commands.flushCommands();
    // synchronization example: Wait until all futures complete
    LettuceFutures.awaitAll(10, TimeUnit.SECONDS,
    futures.toArray(new RedisFuture[futures.size()]));
    

    参照:https://github.com/lettuce-io/lettuce-core/wiki/Pipelining-and-command-flushing



    1. ScaleGridDBaaSforRedis™をAWSVirtualPrivate Cloud(VPC)にデプロイする

    2. jsonファイルをmongoにインポートする適切な方法

    3. Meteorメソッドと拒否/許可ルール

    4. MongoDBに日付を保存するための最良の方法は何ですか?