Spring Data Redis Redisクラスタ---メモ5


続きます...
6.Redis Cluster(Redisクラスタ)
Redisクラスタにはバージョン3.0+が必要で、いくつかの特性とクラスタの能力を提供します.詳細はRedis公式サイトを参照してください.
注意:Redisクラスタはjedisとlettuceのみをサポートしています.
6.1.Enableling Redis Cluster(redisクラスタを開く)
クラスタサポートは、非クラスタ通信として同じブロックを構築することに基づいている.RedisClusterConnectionはRedisConnectionに拡張されています.クラスタ通信と異常を処理してSpring DAO異常に変換します.
RedisClusterConnectionは、RedisConnectionFactoryによって作成されます.一方、RedisConnectionFactoryはRedisClusterConfigurationに従って構成されます.
例1:RedisクラスタのRedisConnectionFactory構成
@Component
@ConfigurationProperties(prefix = "spring.redis.cluster")
public class ClusterConfigurationProperties {

    /*
     * spring.redis.cluster.nodes[0] = 127.0.0.1:7379
     * spring.redis.cluster.nodes[1] = 127.0.0.1:7380
     * ...
     */
    List nodes;

    /**
     * Get initial collection of known cluster nodes in format {@code host:port}.
     *
     * @return
     */
    public List getNodes() {
        return nodes;
    }

    public void setNodes(List nodes) {
        this.nodes = nodes;
    }
}

@Configuration
public class AppConfig {

    /**
     * Type safe representation of application.properties
     */
    @Autowired ClusterConfigurationProperties clusterProperties;

    public @Bean RedisConnectionFactory connectionFactory() {

        return new JedisConnectionFactory(
            new RedisClusterConfiguration(clusterProperties.getNodes()));
    }
}

注意:
RedisClusterConfigurationは、PropertySourceで定義することもできます.
属性の設定
spring.redis.cluster.nodes:カンマで区切られた複数のhost:portペアの分割
spring.redis.cluster.max-redirects:クラスタ再導を許可する数
ヒント:
初期化構成指定ドライバライブラリはクラスタノードを初期化します.アクティブなクラスタから再構成した結果、オリジナルドライバのみが存在し、プロファイルに書き込まれません.
6.2. Working With Redis Cluster Connection(redisクラスタ接続と連携)
上述したように、Redisクラスタは、単一のノードRediまたは主従関係Redis環境とは異なる.その理由はRedisが自動的にスライスするからです.異なるkeyが異なるslot(スロット)にマッピングされ、もちろんこれらは異なるノードに分けられます.したがって、コマンドは、実行前に同じslot(スロット)内にあるかどうかを断言して、実行エラーを回避する必要があります.さらに言えば、単一のクラスタノードは、サーバにのみkeysコレクションがあり、コマンドの下で特定のサーバに達し、このサーバのすべての管理keyのみを返します.これはすべてのkeysを取得する非常に簡単な例です.クラスタ環境では、特定のkeysのみを送信するサーバにコマンドが発行されます.すべてのkeyを取得する場合は、すべてのプライマリノードを知る必要があります.
特定のkeysを対応するslotにリダイレクトすると、このサービスノードはdriverライブラリで動作します.ノードから情報を収集したり、すべてのノードにコマンドを送信したりするなど、より高度な機能は、RedisClusterConnectionが必要とする作業です.前にkeysの例を取得すると、keys(pattern)メソッドは各プライマリノードを取得し、各プライマリノードでKEYSコマンドを実行することを意味する.単一のノードのみを要求するために、RedisClusterConnectionはこれらの方法(例えばkeys(node,pattern)を再ロードする.
RedisClusterNodeはRedisClusterConnectionを介して使用できます.clusterGetNodes取得、またはコンストラクション関数がホストおよびポートまたはノードIDに送信されます.
例2.クラスタによるコマンドの簡単な実行
[email protected]:7379 > cluster nodes

6b38bb... 127.0.0.1:7379 master - 0 0 25 connected 0-5460                   1      
7bb78c... 127.0.0.1:7380 master - 0 1449730618304 2 connected 5461-10922     2   
164888... 127.0.0.1:7381 master - 0 1449730618304 3 connected 10923-16383    3  
b8b5ee... 127.0.0.1:7382 slave 6b38bb... 0 1449730618304 25 connected         4 
RedisClusterConnection connection = connectionFactory.getClusterConnnection();

connection.set("foo", value);         5                                         
connection.set("bar", value);          6                                        

connection.keys("*");                  7                                        

connection.keys(NODE_7379, "*");         8                                      
connection.keys(NODE_7380, "*");           9                                    
connection.keys(NODE_7381, "*");          10                                     
connection.keys(NODE_7382, "*");          11                                     

上の番号の説明
1.プライマリノードが管理するslotsが0~5460からポートにバックアップされるのは7382
2.プライマリノード管理slots 5461から10922
3.マスターノード管理slots 10923から16383
4.ノードからポート番号7379のデータをバックアップする
5.ノードポート7381サービスへのルーティングを要求するslot 12182
6.ノードポート7379サービスへのルーティングを要求するslot 5061
7.要求ルーティングノードポート737973807381-」[foo,bar]
8.ノードポートへのルーティングを要求する7379-[bar]
9.ノードポートへのルーティングを要求する7380-」【】
10.要求ルーティングノードポート7381-[foo]
11.ノードポートへのルーティングを要求する7382-[bar]
MGETは、slotリクエスト、例えば、すべてのkeyが同じslotにマッピングされると、オリジナルドライバライブラリを介して自動的にサービスを取得する.しかし、そうでなければ、RedisClusterConnectionは複数の平行GETコマンドを実行し、複数のノードslotのサービスを取得し、最後に累積した結果を返す.この性能は単一のslotで実行する効率が高いに違いないので、使用するときは注意しなければなりません.疑わしい場合、{my-prefix}などの接頭辞と括弧を単一のノードで使用することを考慮する.fooと{my-prefix}.bar、彼は同じslotにマッピングされます.
例3,slotリクエスト処理例にまたがる
[email protected]:7379 > cluster nodes

6b38bb... 127.0.0.1:7379 master - 0 0 25 connected 0-5460                      
7bb...           1
RedisClusterConnection connection = connectionFactory.getClusterConnnection();

connection.set("foo", value);         // slot: 12182
connection.set("{foo}.bar", value);   // slot: 12182
connection.set("bar", value);         // slot:  5461

connection.mGet("foo", "{foo}.bar");                                           2

connection.mGet("foo", "bar");                                               3  

説明:
1.上記の例のように構成する
2.Keysは同じslot-』127.0.0.1:7381 MGET foo{foo}にマッピングする.bar
Keysは異なるslotsにマッピングされ,単一slotルーティングから対応するnodesに分離される.
3.-》127.0.0.1:7379 GETbar
-》127.0.0.1:7379 GET foo
上記の例はSpring Data Redis処理の一般的なポリシーを示している.メモリに大量のデータをロードする必要がある場合があることを考慮する必要があります.それ以外に、すべてのslotリクエストが安全であるわけではありません.コマンドPFCOUNTなどの異常も発生する可能性があります.
6.3. Working With RedisTemplate and ClusterOperations(RedisTemplateクラスタ操作)、
一般的なRedisTemplateの一般的な目的、構成および使用については、Working with Objects through RedisTemplateの章を参照してください.
警告:
RedisTemplate#keySerializerは慎重に設定してください.任意のjson関連RedisSerializersをjson構造の変更として使用するとhash slot計算に直ちに影響を及ぼす.
RedisTemplateはClusterOperationsを通じて特別な操作を提供します.RedisTemplate.opsForCluster()を取得します.単一のノードでコマンドを明示的に実行して、シーケンス化/逆シーケンス化プロパティを取得できます.Cluster MEETなどの高度な管理コマンドやresharding(再スライス)などの高度な操作を提供します.
例4.RedisTemplateによるRedisClusterConnectionの取得
ClusterOperations clusterOps = redisTemplate.opsForCluster();
clusterOps.shutdown(NODE_7379);   1                                    

説明:
1.ノード7379を閉じ、ノードから引き継ぐ.