nablarch.integration.redisstore.lettuce.LettuceClusterRedisClient Maven / Gradle / Ivy
The newest version!
package nablarch.integration.redisstore.lettuce;
import io.lettuce.core.RedisURI;
import io.lettuce.core.cluster.RedisClusterClient;
import io.lettuce.core.cluster.api.StatefulRedisClusterConnection;
import io.lettuce.core.cluster.api.sync.RedisAdvancedClusterCommands;
import io.lettuce.core.codec.ByteArrayCodec;
import nablarch.core.repository.initialization.Initializable;
import nablarch.core.util.annotation.Published;
import java.util.List;
import java.util.stream.Collectors;
/**
* Cluster 構成の Redis に接続するための {@link LettuceRedisClient} 実装クラス。
*
* このクラスの {@link #getType()} は、識別子 {@code "cluster"} を返す。
*
*
* @author Tanaka Tomoyuki
*/
@Published(tag = "architect")
public class LettuceClusterRedisClient extends AbstractLettuceRedisClient implements Initializable {
private RedisClusterClient client;
private StatefulRedisClusterConnection connection;
private RedisAdvancedClusterCommands commands;
/**
* 接続するRedisクラスタの、各ノードURIのリスト。
*/
protected List uriList;
/**
* コンストラクタ。
*/
public LettuceClusterRedisClient() {
super("cluster");
}
@Override
public void set(String key, byte[] value) {
commands.set(encodeKey(key), value);
}
@Override
public void pexpire(String key, long milliseconds) {
commands.pexpire(encodeKey(key), milliseconds);
}
@Override
public void pexpireat(String key, long milliseconds) {
commands.pexpireat(encodeKey(key), milliseconds);
}
@Override
public long pttl(String key) {
return commands.pttl(encodeKey(key));
}
@Override
public byte[] get(String key) {
return commands.get(encodeKey(key));
}
@Override
public void del(String key) {
commands.del(encodeKey(key));
}
@Override
public boolean exists(String key) {
return commands.exists(encodeKey(key)) == 1L;
}
/**
* 接続するRedisクラスタの、各ノードのURIをリストで設定する。
*
* URIの書式については、Lettuceのドキュメントを参照。
*
*
* @param uriList 各ノードのURIのリスト
*/
public void setUriList(List uriList) {
this.uriList = uriList;
}
/**
* {@inheritDoc}
*
* このメソッドは、 {@link #createClient()} と {@link #createConnection(RedisClusterClient)} メソッドを使って
* {@link RedisClusterClient} と {@link StatefulRedisClusterConnection} のインスタンスを生成している。
* これらのインスタンスの設定を任意にカスタマイズしたい場合は、このクラスを継承したサブクラスを作り、
* それぞれの {@code create} メソッドをオーバーライドすること。
*
*/
@Override
public void initialize() {
client = createClient();
connection = createConnection(client);
commands = connection.sync();
}
/**
* {@link RedisClusterClient} のインスタンスを生成する。
* @return 生成された {@link RedisClusterClient}
*/
protected RedisClusterClient createClient() {
List redisUriList = uriList.stream().map(RedisURI::create).collect(Collectors.toList());
return RedisClusterClient.create(redisUriList);
}
/**
* {@link StatefulRedisClusterConnection} のインスタンスを生成する。
* @param client {@link #createClient()} で生成された {@link RedisClusterClient} インスタンス
* @return 生成された {@link StatefulRedisClusterConnection}
*/
protected StatefulRedisClusterConnection createConnection(RedisClusterClient client) {
return client.connect(new ByteArrayCodec());
}
@Override
public void dispose() {
connection.close();
client.shutdown();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy