RedisクライアントJedisの使用

12722 ワード

1.Jedisに必要なjarパッケージ
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();
     }