轉載自http://aofengblog.blog.163.com/blog/static/631702120147298317919/
在實際的專案開發中,各種語言是使用Redis的客戶端庫來與Redis互動。針對Java語言,Redis官方推薦Jedis。
Jedis提供了多種操作方式:單機單連線方式、單機連線池方式、多機分散式+連線池方式。
預備
jedis-2.5.2
commons-pool2-2.2.jar
使用單連線
此方式僅建議用於開發環境做除錯用。
// 建立連線
String host = "192.168.56.102";
int port = 6379;
Jedis client = new Jedis(host, port);
// 執行set指令
String result = client.set("key-string", "Hello, Redis!");
System.out.println( String.format("set指令執行結果:%s", result) );
// 執行get指令
String value = client.get("key-string");
System.out.println( String.format("get指令執行結果:%s", value) );
執行上述程式碼,控制檯輸出:
set指令執行結果:OK
get指令執行結果:Hello, Redis!
使用連線池
此方式適用於僅使用單個Redis例項的場景。
// 生成連線池配置資訊
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(10);
config.setMaxTotal(30);
config.setMaxWaitMillis(3*1000);
// 在應用初始化的時候生成連線池
JedisPool pool = new JedisPool(config, "192.168.56.102", 6379);
// 在業務操作時,從連線池獲取連線
Jedis client = pool.getResource();
try {
// 執行指令
String result = client.set("key-string", "Hello, Redis!");
System.out.println( String.format("set指令執行結果:%s", result) );
String value = client.get("key-string");
System.out.println( String.format("get指令執行結果:%s", value) );
} catch (Exception e) {
// TODO: handle exception
} finally {
// 業務操作完成,將連線返回給連線池
if (null != client) {
pool.returnResource(client);
}
} // end of try block
// 應用關閉時,釋放連線池資源
pool.destroy();
執行上述程式碼,控制檯輸出:
set指令執行結果:OK
get指令執行結果:Hello, Redis!
使用連線池+分散式
在規模較大的系統中,往往會有多個Redis例項做負載均衡。並且還實現主從備份,當主例項發生故障時,切換至從例項提供服務。
類似於Memcached的客戶端,Jedis也提供了客戶端分散式操作的方式,採用一致性雜湊演算法。
// 生成多機連線資訊列表
List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
shards.add( new JedisShardInfo("127.0.0.1", 6379) );
shards.add( new JedisShardInfo("192.168.56.102", 6379) );
// 生成連線池配置資訊
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(10);
config.setMaxTotal(30);
config.setMaxWaitMillis(3*1000);
// 在應用初始化的時候生成連線池
ShardedJedisPool pool = new ShardedJedisPool(config, shards);
// 在業務操作時,從連線池獲取連線
ShardedJedis client = pool.getResource();
try {
// 執行指令
String result = client.set("key-string", "Hello, Redis!");
System.out.println( String.format("set指令執行結果:%s", result) );
String value = client.get("key-string");
System.out.println( String.format("get指令執行結果:%s", value) );
} catch (Exception e) {
// TODO: handle exception
} finally {
// 業務操作完成,將連線返回給連線池
if (null != client) {
pool.returnResource(client);
}
} // end of try block
// 應用關閉時,釋放連線池資源
pool.destroy();
執行上述程式碼,控制檯輸出:
set指令執行結果:OK
get指令執行結果:Hello, Redis!