redisのjavaクライアントlettuceの使用


公式文書から翻訳して整理したものは、表現が不正確な場合があります
ドキュメントのアドレス:https://github.com/lettuce-io/lettuce-core/wiki/About-lettuce
1.lettuceの紹介
lettuceはスレッドが安全なredisクライアントです.同期、非同期、reactive(?)の提供のAPIs..ブロックやトランザクション型の操作、例えばBLPOPMULTI/EXECを避けることができれば、複数のスレッドが同じ接続を共有することができます.複数の接続は、NIOフレームワークnettyによって効率的に管理されます.
また、哨兵モード、クラスタモード、データモードをサポートします.
彼の大部分の方法はredisの命令にちょうど対応している.
2. RedisURI
1.作成
RedisURIは、データベース名、パスワード、url、タイムアウト時間など、redis接続の標準情報です.次の3つの方法で作成できます.
  • RedisURI.create("redis://localhost/");
  • RedisURI.Builder.redis("localhost", 6379).auth("password").database(1).build();
  • new RedisURI("localhost", 6379, 60, TimeUnit.SECONDS);

  • 2.uriの文法
  • 単独のredis:
  • redis ://[: password@] host [: port] [/database][? [timeout=timeout[d|h|m|s|ms|us|ns]] [&_database=database_]]
  • 個別のredis ssl:
  • rediss ://[: password@] host [: port] [/database][? [timeout=timeout[d|h|m|s|ms|us|ns]] [&_database=database_]]
  • 個別のredis unixのsocket
  • redis-socket :// path [?[timeout=timeout[d|h|m|s|ms|us|ns]][&_database=database_]]
  • redis哨兵モード
  • redis-sentinel ://[: password@] host1[: port1] [, host2[: port2]] [, hostN[: portN]] [/database][?[timeout=timeout[d|h|m|s|ms|us|ns]] [&_sentinelMasterId=sentinelMasterId_] [&_database=database_]]
    3.時間単位
  • d天
  • h時間
  • m分
  • s秒
  • ms ms ms
  • usマイクロ秒
  • ns納秒
  • 4.例
  • urlとport
  • RedisClient client = RedisClient.create(RedisURI.create("localhost", 6379));
    client.setDefaultTimeout(20, TimeUnit.SECONDS);
    
    // …
    
    client.shutdown();
  •  builder
  • RedisURI redisUri = RedisURI.Builder.redis("localhost")
                                    .withPassword("authentication")
                                    .withDatabase(2)
                                    .build();
    RedisClient client = RedisClient.create(redisUri);
  • ssl builder
  • RedisURI redisUri = RedisURI.Builder.redis("localhost")
                                    .withSsl(true)
                                    .withPassword("authentication")
                                    .withDatabase(2)
                                    .build();
    RedisClient client = RedisClient.create(redisUri);
  •  String RedisURI
  • RedisURI redisUri = RedisURI.create("redis://authentication@localhost/2");
    RedisClient client = RedisClient.create(redisUri);
    
    // …
    
    client.shutdown();

     
    3.基本使用
  • maven
  • 
    			biz.paluch.redis
    			lettuce
    			5.0.0.Beta1
    		
  • 接続確立
  • RedisClient client = RedisClient.create("redis://localhost");
    
    StatefulRedisConnection connect = client.connect();
  • 同期方式
  • RedisCommands commands = connect.sync(); 
    
    String value = commands.get("foo");
  • 非同期方式
  • RedisAsyncCommands redisAsync = connect.async();
    		RedisFuture redisFuture = redisAsync.get("a");
    		try {
    			String a = redisFuture.get();
    			System.out.println(a);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		} catch (ExecutionException e) {
    			e.printStackTrace();
    		}

    RedisFutureのgetメソッドはブロックメソッドで、結果を返すまでブロックされ、タイムアウト時間を追加できます.
  • 接続を閉じる
  • connection.close(); 
    
    client.shutdown(); 

    4. Reactive API
    呆然と...
    5. Pub Sub
    サブスクリプションの使用のパブリッシュ
    6. Transactions
    トランザクションの使用
    7. dynamic Redis Command Interfaces
    カスタムコマンド
    8. Master Slave
    マスタスレーブモードの使用
    9. Redis Sentinel
    歩哨モードの使用
    10. Redis Cluster
    クラスタモードの使用
    11.接続プールの使用
    lettuceはスレッドが安全で、複数のスレッドで同時に使用できるので、スレッドプールは必須ではありません.lettuceは、一般的な接続プールのサポートを提供します.
    lettuceの接続プール依存common-pool 2
    
        org.apache.commons
        commons-pool2
        2.4.3
    

    1.接続プールの返却の2つの方式
  • StatefulConnection.close()
  • GenericObjectPool.returnObject(…)

  • 2.基本使用
    RedisClient client = RedisClient.create(RedisURI.create(host, port));
    
    GenericObjectPool> pool = ConnectionPoolSupport
                   .createGenericObjectPool(() -> client.connect(), new GenericObjectPoolConfig());
    
    // executing work
    try (StatefulRedisConnection connection = pool.borrowObject()) {
    
        RedisCommands commands = connection.sync();
        commands.multi();
        commands.set("key", "value");
        commands.set("key2", "value2");
        commands.exec();
    }
    
    // terminating
    pool.close();
    client.shutdown();

    3.クラスタ使用
    RedisClusterClient clusterClient = RedisClusterClient.create(RedisURI.create(host, port));
    
    GenericObjectPool> pool = ConnectionPoolSupport
                   .createGenericObjectPool(() -> clusterClient.connect(), new GenericObjectPoolConfig());
    
    // execute work
    try (StatefulRedisClusterConnection connection = pool.borrowObject()) {
        connection.sync().set("key", "value");
        connection.sync().blpop(10, "list");
    }
    
    // terminating
    pool.close();
    clusterClient.shutdown();