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

クラスタモードで特定のキーを特定のredisインスタンスに配置する方法はありますか?

    できますが、それは些細なことではありません。まず、Redisはキーに中括弧を使用してそのシャーディング部分を決定するため、キーを変更して任意のシャードに送信することができます。

    ここで、2つのものが必要です。

    1. どのシャードまたはスロット範囲がどのredisインスタンスに存在するかのマップ。

    2. どの文字列がどのスロットにマップされているかを知る方法。キーに「シャーディング文字列」を強制して、特定のシャードにルーティングできます。

    最初のものは簡単です-CLUSTER SLOTS そのマップが表示されます。解析するだけです。

    2つ目はもっとトリッキーですが、幸いなことに、私はすでにこの作業を行っています。 Redisクラスターの16384スロットのそれぞれにマッピングする最短の英数字の文字列のテーブルを作成しました。私はCにいますが、簡単に何にでも変換できます。 https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e

    したがって、キーと目的のノードが与えられると、アルゴリズムは次のようになります。

    1. スロットマップを見て、そのノードにあるスロット範囲を取得します。

    2. そのノードの範囲内のスロットを選択します。

    3. シャーディングテーブルでそのスロットのエントリを探します。

    4. キーに中かっこを付けてその文字列を叩きます。例えばfooを変換します foo{e4x}へ 。

    以上です!このキーを使用するコマンドはすべて、そのシャードにルーティングされます。

    疑似Pythonバージョン:

    # Build this table from CLUSTER SLOTS or CLUSTER NODES
    slots = {
       '127.0.0.1:7000': [(0, 1045),(2000,2100)]
       ...
     }
    
    # Build this table from the C example:
    sharding_table = ["06S", "Qi", "5L5", "4Iu", "4gY", ....]
    
    def retarget_key(key, node):
        ranges = slots[node] 
    
        sharding_key = shading_table[ranges[0][0]]
        return '%s{%s}' % (key, sharding_key)
    



    1. オプションuseFindAndModifyはサポートされていません

    2. PredisのMATCHオプションでSCANを使用する方法

    3. MongoDBデフォルトのユーザーとパスワードは何ですか?

    4. Javaからのnginxによるポートフォワーディング