1. 程式人生 > >用Jedis獲取redis連線(叢集和非叢集狀態下)

用Jedis獲取redis連線(叢集和非叢集狀態下)

第一:非叢集狀態下

非叢集狀態下用Jedis獲取redis連線,得到Jedis物件即可,一共有兩種:

1.利用Jedis構造器,僅限用於測試,在實際專案中肯定是用JedisPool。

  Jedis(String host);

  Jedis(String host , int port);

2.利用JedisPool

主要是利用Jedis jedis=jedisPool.getResource();

    JedisPool有N多個構造器,常用的構造器引數有GenericObjectPoolConfig poolConfig,String host,int port,int timeout,String password,建立GenericObjectPoolConfig物件時我們一般用其子類JedisPoolConfig (redis.clients.jedis.JedisPoolConfig),timeout是連線redis伺服器的超時時間,以毫秒為單位,一般設定為0,如果不設為0,則不可設定太小,如果設成1、2,那麼可能因為網路原因在1毫秒、2毫秒之內沒有連上伺服器而報錯。見下例:

public static void main(String[] args) {
	JedisPoolConfig poolConfig = new JedisPoolConfig();
	// 最大連線數
	poolConfig.setMaxTotal(2);
	// 最大空閒數
	poolConfig.setMaxIdle(2);
	// 最大允許等待時間,如果超過這個時間還未獲取到連線,則會報JedisException異常:
	// Could not get a resource from the pool
	poolConfig.setMaxWaitMillis(1000);
	JedisPool pool = new JedisPool(poolConfig, "192.168.83.128", 6379, 0, "123");
	Jedis jedis = null;
	try {
		for (int i = 0; i < 5; i++) {
			jedis = pool.getResource();
			jedis.set("foo" + i, "bar" + i);
			System.out.println("第" + (i + 1) + "個連線, 得到的值為" + jedis.get("foo" + i));
			// 用完一定要釋放連線
			jedis.close();
		}
	} finally {
		pool.close();
	}
}
如上,創建出一個JedisPool物件,然後呼叫其getResource()方法獲取redis連線即可,之後就可以呼叫Jedis API操作redis了。jedis連線用完要釋放即close,如果不close,則產生的連線會越來越多,當達到了最大連線數,再想獲得連線,就會等待,當超過了最大等待時間後就會報異常。

第二:叢集狀態下

叢集狀態下用Jedis獲取redis連線,是得到JedisCluster物件,之後對redis進行操作都是用此物件的方法進行的:

public static void main(String[] args) {
	JedisPoolConfig poolConfig = new JedisPoolConfig();
	// 最大連線數
	poolConfig.setMaxTotal(1);
	// 最大空閒數
	poolConfig.setMaxIdle(1);
	// 最大允許等待時間,如果超過這個時間還未獲取到連線,則會報JedisException異常:
	// Could not get a resource from the pool
	poolConfig.setMaxWaitMillis(1000);
	Set<HostAndPort> nodes = new LinkedHashSet<HostAndPort>();
	nodes.add(new HostAndPort("192.168.83.128", 6379));
	nodes.add(new HostAndPort("192.168.83.128", 6380));
	nodes.add(new HostAndPort("192.168.83.128", 6381));
	nodes.add(new HostAndPort("192.168.83.128", 6382));
	nodes.add(new HostAndPort("192.168.83.128", 6383));
	nodes.add(new HostAndPort("192.168.83.128", 6384));
	JedisCluster cluster = new JedisCluster(nodes, poolConfig);
	String name = cluster.get("name");
	System.out.println(name);
	cluster.set("age", "18");
	System.out.println(cluster.get("age"));
	try {
		cluster.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

用叢集時,好像沒有辦法設定叢集的引數,比如最大連線數,雖然在建立JedisCluster  物件時傳了JedisPoolConfig物件進去,但是JedisPoolConfig物件中的設定是不生效的。