本文主要描述使用jedis進行redis-cluster操作
jedis
jedis是redis官方推薦使用的java redis客戶端,github地址為,https://github.com/xetorthio/jedis,本文使用jedis進行redis集群的操作。
jedis從2.3.0版本后開始支持redis cluster,不過看官方的released文檔(https://github.com/xetorthio/jedis/releases)在2.3.0版本后的每個版本都會修復一些cluster相關的bug,基本上在2.6.3版本后,才開始沒有cluster相關的bug,所以建議jedis版本至少大於2.6.3.目前最新版本是2.7.2.
maven:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
hello world
jedis官方推薦的helloworld:
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
//Jedis Cluster will attempt to discover cluster nodes automatically
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7379));
JedisCluster jc = new JedisCluster(jedisClusterNodes);
jc.set("foo", "bar");
String value = jc.get("foo");
實際使用:
private void genClusterNode() {
clusterNodes = new HashSet<HostAndPort>();
clusterNodes.add(new HostAndPort("192.168.137.10", 7000));
clusterNodes.add(new HostAndPort("192.168.137.10", 7001));
clusterNodes.add(new HostAndPort("192.168.137.10", 7002));
clusterNodes.add(new HostAndPort("192.168.137.10", 7003));
clusterNodes.add(new HostAndPort("192.168.137.10", 7004));
clusterNodes.add(new HostAndPort("192.168.137.10", 7005));
}
private void genJedisConfig() {
config = new JedisPoolConfig();
config.setMaxTotal(1000);
config.setMaxIdle(100);
config.setTestOnBorrow(true);
}
public void clusterInit() {
genClusterNode();
genJedisConfig();
jedisCluster = new JedisCluster(clusterNodes, 5000, config);
}
private void clusterSetKey(String key, String value) {
jedisCluster.set(key, value);
}
解讀
JedisCluster是jedis封裝的關於redis cluster操作的class。
JedisCluster里主要有兩個成員變量:maxRedirections和connectionHandler。
maxRedirections:
- 重試次數,在執行失敗后,進行的重試次數,默認是5,
connectionHandler:
- cluster里面的連接管理者
- 包括JedisClusterInfoCache,里面會緩存nodes和slots的信息,同時對於各個nodes和slots會緩存一個JedisPool
因此在調用RedisCluster對象時,直接使用JedisCluster對象即可,比如在調用JedisCluster.set時:
- JedisCluster會從connectionHandler基於key找出對應的SLOTS和NODES,並找出對應的JedisPool對象
- 從JedisPool對象中找出可用的Jedis實例,執行Jedis對應的set操作
同時在new JedisCluster的時候,還可以傳入timeout參數,這里的timeout表示從redis-server讀取數據的超時時間,默認的是2s,當數據量比較大的時候,可以考慮增大timeout。
