RedisクライアントJedisの使用
1.Jedisに必要なjarパッケージ
Commons-pool-1.6.jar
Jedis-2.1.0.jar
2.Jedis常用操作
(1)接続性のテスト
(2)5つのデータ型と1つのkeyの使用
(3)取引の提出
①日常
②施錠
(4)主従レプリケーション
3.JedisPool(接続プールを使用してRedisに接続)
)
(1)Jedisインスタンスを取得するにはJedisPoolから取得する必要がある
(2)Jedisインスタンスを使い切るにはJedisPoolに返却する必要がある
(3)Jedisの使用中にエラーが発生した場合はJedisPoolに返却する必要がある
(4)ケースコード
JedisPoolUtil
JedisPool.getResource();
(5)構成のまとめ:
JedisPoolの構成パラメータの大部分はJedisPoolConfigの対応する項によって与えられる.
① maxActive:
1つのpoolがどれだけのjedisインスタンスを割り当てることができるかを制御し、poolを通過する.getResource()を取得します.付与値が-1の場合、制限はありません.poolがmaxActive個jedisインスタンスを割り当てた場合、poolの状態はexhaustedになります.
② maxIdle:
1つのpoolがidle(アイドル)のjedisインスタンスの最大数を制御します.
3 whenExhaustedAction:poolのjedisインスタンスがallocatedで完了した場合、poolが取る操作を示す.デフォルトは3種類あります.
WHEN_EXHAUSTED_FAIL-->jedisインスタンスがない場合は、NoSuchElementExceptionを直接放出します.
WHEN_EXHAUSTED_BLOCK-->は、ブロックされているか、maxWaitに達したときに投げ出されることを示します.
JedisConnectionException;
WHEN_EXHAUSTED_GROW-->はjedisインスタンスを新規作成することを表し、つまり設定したmaxActiveが役に立たないことを表す.
④maxWait:borrowの1つのjedisインスタンスの場合、最大の待ち時間を表し、待ち時間を超えた場合、直接投げ出す
JedisConnectionException;
⑤
testOnBorrow:
borrowのjedisインスタンスの場合、validate操作を事前に行うかどうか.trueの場合、得られたjedisインスタンスはいずれも使用可能である.
⑥testOnReturn:returnがpoolに与えた場合、validate操作を事前に行うか.
⑦testWhileIdle:trueの場合、idle object evitorスレッドがidle objectをスキャンしていることを示し、validateが失敗した場合、このobjectはpoolからdropされます.これはtimeBetweenEveictionRunsMillisが0より大きい場合にのみ意味がある.
⑧timeBetweenEveictionRunsMillis:idle object evitorの2回のスキャンの間にsleepを要するミリ秒数を表す.
⑨numTestsPerEvictionRun:idle object evitorがスキャンするたびに最も多いオブジェクト数を表す.
⑩m i n v e v i c tableIdleTimeMillis:オブジェクトが少なくともidle状態にとどまる最短時間を表し、idle object evitorによってスキャンされて駆逐される.これはtimeBetweenEveictionRunsMillisが0より大きい場合にのみ意味がある.
softMinEveictableIdleTimeMillis:minEveictableIdleTimeMillisに加えて、少なくともminIdle個のオブジェクトがpoolに入っています.-1の場合、evictedはidle timeに基づいてオブジェクトを駆逐しません.m i n v e v i c tableIdleTimeMillis>0の場合、この設定は意味がなく、timeBetweenEveictionRunsMillisが0より大きい場合にのみ意味があります.
⑫
lifo:borrowObjectがオブジェクトを返す場合、DEFAULT_を使用します.LIFO(last in first out、すなわちcacheのような最も頻繁に使用されるキュー)は、FalseであればFIFOキューを表す.
説明:JedisPoolConfigのパラメータのデフォルト設定は次のとおりです.
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1
4.話している
使用
JedisのJavaクライアント接続サーバ側:
jedis依存jarパッケージをプロジェクトに追加する必要があります.Mavenエンジニアリングではjedisの座標を依存に追加する必要があります.
サービス層に追加することを推奨します.
(1)スタンドアロン版接続
ステップ1:Jedisオブジェクトを作成します.サービス側のipおよびポートを指定する必要があります.
ステップ2:Jedisオブジェクトを使用してデータベースを操作し、各redisコマンドはメソッドに対応します.
ステップ3:結果を印刷します.
ステップ4:Jedisを閉じる
(2)スタンドアロン版接続用接続プールの接続
ステップ1:JedisPoolオブジェクトを作成します.サービス側のipおよびポートを指定する必要があります.
ステップ2:JedisPoolからJedisオブジェクトを取得します.
ステップ3:Jedisを使用してredisサーバを操作します.
ステップ4:操作が完了したらjedisオブジェクトを閉じ、プールに接続してリソースを回収します.
ステップ5:JedisPoolオブジェクトを閉じます.
(3)クラスタ版への接続
ステップ1:JedisClusterオブジェクトを使用します.Setパラメータが必要です.Redisノードのリスト.
ステップ2:JedisClusterオブジェクトを直接使用してredisを操作し、システムに単一の例が存在する.
ステップ3:結果の印刷
ステップ4:システムが閉じる前に、JedisClusterオブジェクトを閉じます.
Commons-pool-1.6.jar
Jedis-2.1.0.jar
2.Jedis常用操作
(1)接続性のテスト
public class Demo01 {
public static void main(String[] args) {
// Redis
Jedis jedis = new Jedis("127.0.0.1",6379);
// , pong OK
System.out.println("connection is OK==========>: "+jedis.ping());
}
}
(2)5つのデータ型と1つのkeyの使用
import java.util.*;
import redis.clients.jedis.Jedis;
public class Test02{
public static void main(String[] args){
Jedis jedis = new Jedis("127.0.0.1",6379);
//key
Set keys = jedis.keys("*");
for (Iterator iterator = keys.iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
System.out.println(key);
}
System.out.println("jedis.exists====>"+jedis.exists("k2"));
System.out.println(jedis.ttl("k1"));
//String
//jedis.append("k1","myreids");
System.out.println(jedis.get("k1"));
jedis.set("k4","k4_redis");
System.out.println("----------------------------------------");
jedis.mset("str1","v1","str2","v2","str3","v3");
System.out.println(jedis.mget("str1","str2","str3"));
//list
System.out.println("----------------------------------------");
//jedis.lpush("mylist","v1","v2","v3","v4","v5");
List list = jedis.lrange("mylist",0,-1);
for (String element : list) {
System.out.println(element);
}
//set
jedis.sadd("orders","jd001");
jedis.sadd("orders","jd002");
jedis.sadd("orders","jd003");
Set set1 = jedis.smembers("orders");
for (Iterator iterator = set1.iterator(); iterator.hasNext();) {
String string = (String) iterator.next();
System.out.println(string);
}
jedis.srem("orders","jd002");
System.out.println(jedis.smembers("orders").size());
//hash
jedis.hset("hash1","userName","lisi");
System.out.println(jedis.hget("hash1","userName"));
Map map = new HashMap();
map.put("telphone","13811814763");
map.put("address","atguigu");
map.put("email","[email protected]");
jedis.hmset("hash2",map);
List result = jedis.hmget("hash2", "telphone","email");
for (String element : result) {
System.out.println(element);
}
//zset
jedis.zadd("zset01",60d,"v1");
jedis.zadd("zset01",70d,"v2");
jedis.zadd("zset01",80d,"v3");
jedis.zadd("zset01",90d,"v4");
Set s1 = jedis.zrange("zset01",0,-1);
for (Iterator iterator = s1.iterator(); iterator.hasNext();) {
String string = (String) iterator.next();
System.out.println(string);
}
}
}
(3)取引の提出
①日常
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Response;
import redis.clients.jedis.Transaction;
public class Test03{
public static void main(String[] args){
Jedis jedis = new Jedis("127.0.0.1",6379);
/*
jedis.watch("serialNum");
jedis.set("serialNum","s#####################");
jedis.unwatch();
*/
Transaction transaction = jedis.multi();//
Response response = transaction.get("serialNum");
transaction.set("serialNum","s002");
response = transaction.get("serialNum");
transaction.lpush("list3","a");
transaction.lpush("list3","b");
transaction.lpush("list3","c");
//transaction.discard();
transaction.exec();
System.out.println("serialNum***********"+response.get());
}
}
②施錠
public class TestTransaction {
public boolean transMethod() {
Jedis jedis = new Jedis( "127.0.0.1", 6379);
int balance;//
int debt;//
int amtToSubtract = 10;//
jedis.watch("balance");
//jedis.set("balance","5");// , 。
balance = Integer.parseInt (jedis.get("balance" ));
if (balance < amtToSubtract) {
jedis.unwatch();
System.out.println( "modify");
return false;
} else {
System.out.println( "***********transaction");
Transaction transaction = jedis.multi();
transaction.decrBy("balance", amtToSubtract);
transaction.incrBy("debt", amtToSubtract);
transaction.exec();
balance = Integer.parseInt (jedis.get("balance" ));
debt = Integer.parseInt (jedis.get("debt" ));
System.out.println( "*******" + balance);
System.out.println( "*******" + debt);
return true;
}
}
/**
* ,watch , , , ,
* 。
* balance, , , ; , ,
* balance , ( exec) , , 。
*/
public static void main(String[] args) {
TestTransaction test = new TestTransaction();
boolean retValue = test.transMethod();
System.out.println("main retValue-------: " + retValue);
}
}
(4)主従レプリケーション
public static void main(String[] args) throws InterruptedException{
Jedis jedis_M = new Jedis("127.0.0.1",6379);
Jedis jedis_S = new Jedis("127.0.0.1",6380);
jedis_S.slaveof("127.0.0.1",6379);
jedis_M.set("k6","v6");
Thread.sleep(500);
System.out.println(jedis_S.get("k6"));
}
3.JedisPool(接続プールを使用してRedisに接続)
)
(1)Jedisインスタンスを取得するにはJedisPoolから取得する必要がある
(2)Jedisインスタンスを使い切るにはJedisPoolに返却する必要がある
(3)Jedisの使用中にエラーが発生した場合はJedisPoolに返却する必要がある
(4)ケースコード
JedisPoolUtil
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolUtil {
private static volatile JedisPool jedisPool = null;
private JedisPoolUtil() {}
public static JedisPool getJedisPoolInstance(){
if(null == jedisPool){
synchronized (JedisPoolUtil.class){
if(null == jedisPool)
{
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxActive(1000);
poolConfig.setMaxIdle(32);
poolConfig.setMaxWait(100*1000);
poolConfig.setTestOnBorrow(true);
jedisPool = new JedisPool(poolConfig,"127.0.0.1");
}
}
}
return jedisPool;
}
public static void release(JedisPool jedisPool,Jedis jedis){
if(null != jedis){
jedisPool.returnResourceObject(jedis);
}
}
}
JedisPool.getResource();
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class Test01 {
public static void main(String[] args) {
JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
Jedis jedis = null;
try{
jedis = jedisPool.getResource();
jedis.set("k18","v183");
} catch (Exception e) {
e.printStackTrace();
}finally{
JedisPoolUtil.release(jedisPool, jedis);
}
}
}
(5)構成のまとめ:
JedisPoolの構成パラメータの大部分はJedisPoolConfigの対応する項によって与えられる.
① maxActive:
1つのpoolがどれだけのjedisインスタンスを割り当てることができるかを制御し、poolを通過する.getResource()を取得します.付与値が-1の場合、制限はありません.poolがmaxActive個jedisインスタンスを割り当てた場合、poolの状態はexhaustedになります.
② maxIdle:
1つのpoolがidle(アイドル)のjedisインスタンスの最大数を制御します.
3 whenExhaustedAction:poolのjedisインスタンスがallocatedで完了した場合、poolが取る操作を示す.デフォルトは3種類あります.
WHEN_EXHAUSTED_FAIL-->jedisインスタンスがない場合は、NoSuchElementExceptionを直接放出します.
WHEN_EXHAUSTED_BLOCK-->は、ブロックされているか、maxWaitに達したときに投げ出されることを示します.
JedisConnectionException;
WHEN_EXHAUSTED_GROW-->はjedisインスタンスを新規作成することを表し、つまり設定したmaxActiveが役に立たないことを表す.
④maxWait:borrowの1つのjedisインスタンスの場合、最大の待ち時間を表し、待ち時間を超えた場合、直接投げ出す
JedisConnectionException;
⑤
testOnBorrow:
borrowのjedisインスタンスの場合、validate操作を事前に行うかどうか.trueの場合、得られたjedisインスタンスはいずれも使用可能である.
⑥testOnReturn:returnがpoolに与えた場合、validate操作を事前に行うか.
⑦testWhileIdle:trueの場合、idle object evitorスレッドがidle objectをスキャンしていることを示し、validateが失敗した場合、このobjectはpoolからdropされます.これはtimeBetweenEveictionRunsMillisが0より大きい場合にのみ意味がある.
⑧timeBetweenEveictionRunsMillis:idle object evitorの2回のスキャンの間にsleepを要するミリ秒数を表す.
⑨numTestsPerEvictionRun:idle object evitorがスキャンするたびに最も多いオブジェクト数を表す.
⑩m i n v e v i c tableIdleTimeMillis:オブジェクトが少なくともidle状態にとどまる最短時間を表し、idle object evitorによってスキャンされて駆逐される.これはtimeBetweenEveictionRunsMillisが0より大きい場合にのみ意味がある.
softMinEveictableIdleTimeMillis:minEveictableIdleTimeMillisに加えて、少なくともminIdle個のオブジェクトがpoolに入っています.-1の場合、evictedはidle timeに基づいてオブジェクトを駆逐しません.m i n v e v i c tableIdleTimeMillis>0の場合、この設定は意味がなく、timeBetweenEveictionRunsMillisが0より大きい場合にのみ意味があります.
⑫
lifo:borrowObjectがオブジェクトを返す場合、DEFAULT_を使用します.LIFO(last in first out、すなわちcacheのような最も頻繁に使用されるキュー)は、FalseであればFIFOキューを表す.
説明:JedisPoolConfigのパラメータのデフォルト設定は次のとおりです.
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1
4.話している
使用
JedisのJavaクライアント接続サーバ側:
jedis依存jarパッケージをプロジェクトに追加する必要があります.Mavenエンジニアリングではjedisの座標を依存に追加する必要があります.
サービス層に追加することを推奨します.
(1)スタンドアロン版接続
ステップ1:Jedisオブジェクトを作成します.サービス側のipおよびポートを指定する必要があります.
ステップ2:Jedisオブジェクトを使用してデータベースを操作し、各redisコマンドはメソッドに対応します.
ステップ3:結果を印刷します.
ステップ4:Jedisを閉じる
@Test
public void testJedis() throws Exception {
// : Jedis 。 ip 。
Jedis jedis = new Jedis("192.168.25.153", 6379);
// : Jedis , redis 。
String result = jedis.get("hello");
// : 。
System.out.println(result);
// : Jedis
jedis.close();
}
(2)スタンドアロン版接続用接続プールの接続
ステップ1:JedisPoolオブジェクトを作成します.サービス側のipおよびポートを指定する必要があります.
ステップ2:JedisPoolからJedisオブジェクトを取得します.
ステップ3:Jedisを使用してredisサーバを操作します.
ステップ4:操作が完了したらjedisオブジェクトを閉じ、プールに接続してリソースを回収します.
ステップ5:JedisPoolオブジェクトを閉じます.
@Test
public void testJedisPool() throws Exception {
// : JedisPool 。 ip 。
JedisPool jedisPool = new JedisPool("192.168.25.153", 6379);
// : JedisPool Jedis 。
Jedis jedis = jedisPool.getResource();
// : Jedis redis 。
jedis.set("jedis", "test");
String result = jedis.get("jedis");
System.out.println(result);
// : jedis , 。
jedis.close();
// : JedisPool 。
jedisPool.close();
}
(3)クラスタ版への接続
ステップ1:JedisClusterオブジェクトを使用します.Setパラメータが必要です.Redisノードのリスト.
ステップ2:JedisClusterオブジェクトを直接使用してredisを操作し、システムに単一の例が存在する.
ステップ3:結果の印刷
ステップ4:システムが閉じる前に、JedisClusterオブジェクトを閉じます.
@Test
public void testJedisCluster() throws Exception {
// : JedisCluster 。 Set 。Redis 。
Set nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.25.153", 7001));
nodes.add(new HostAndPort("192.168.25.153", 7002));
nodes.add(new HostAndPort("192.168.25.153", 7003));
nodes.add(new HostAndPort("192.168.25.153", 7004));
nodes.add(new HostAndPort("192.168.25.153", 7005));
nodes.add(new HostAndPort("192.168.25.153", 7006));
JedisCluster jedisCluster = new JedisCluster(nodes);
// : JedisCluster redis。 。
jedisCluster.set("hello", "100");
String result = jedisCluster.get("hello");
// :
System.out.println(result);
// : , JedisCluster 。
jedisCluster.close();
}