redis主从复制和连接池
 

  package com.czmec.redis.test; 
 


 import redis.clients.jedis.Jedis; 
 


 /** 
 
  * Created by Administrator on 2016/12/6 0006. 
 
  */ 
 
 public class MasteSlave { 
 
     /** 
 
      * 开启两个端口 模拟两个redis 
 
      */ 
 
     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设置为(端口号为6379)的从机 
 
          */ 
 
         jedis_S.slaveof("127.0.0.1",6379); 
 
         jedis_M.set("k6","v6"); 
 
         //复制需要一定的时间  
 
         Thread.sleep(500); 
 
         System.out.println(jedis_S.get("k6")); 
 
     } 
 
 } 
  
 
 
 
连接池
 

  package com.czmec.redis.test; 
 


 import redis.clients.jedis.Jedis; 
 
 import redis.clients.jedis.JedisPool; 
 
 import redis.clients.jedis.JedisPoolConfig; 
 


 /** 
 
  * Created by Administrator on 2016/12/6 0006. 
 
  */ 
 
 public class redisPool { 
 
     /** 
 
      * 获取Jedis实例需要从JedisPool中获取 
 
      * 用完Jedis实例需要还给JedisPool 
 
      * 如果Jedis在使用的过程中出错,则也需要还给JedisPool 
 
      * 
 
      */ 
 
     public static class JedisPoolUtil{ 
 
         private static  volatile JedisPool jedisPool=null;//被volatile修饰的变量不会被本地线程缓存,对该变量的读写都是直接操作共享内存 
 
         private JedisPoolUtil(){} 
 
         public static JedisPool getJedisPoolInstance(){ 
 
             if(jedisPool==null){ 
 
                 synchronized (JedisPoolUtil.class){ 
 
                     if(jedisPool==null){ 
 
                         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",6379); 
 
                     } 
 
                 } 
 
             } 
 
             return jedisPool; 
 
         } 
 


         /** 
 
          * 释放redis实例 
 
          * @param jedisPool 
 
          * @param jedis 
 
          */ 
 
         public static void release(JedisPool jedisPool, Jedis jedis){ 
 
             if(jedis!=null){ 
 
                 jedisPool.returnResource(jedis); 
 
             } 
 
         } 
 
     } 
 
     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);//关闭实例 释放 
 
         } 
 
     } 
 
 } 
  
JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。
 

  maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。 
 
 maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例; 
 
 whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。 
 
  WHEN_EXHAUSTED_FAIL --> 表示无jedis实例时,直接抛出NoSuchElementException; 
 
  WHEN_EXHAUSTED_BLOCK --> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException; 
 
  WHEN_EXHAUSTED_GROW --> 则表示新建一个jedis实例,也就说设置的maxActive无用; 
 
 maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException; 
 
 testOnBorrow:获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的; 
 




 testOnReturn:return 一个jedis实例给pool时,是否检查连接可用性(ping()); 
 




 testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义; 
 




 timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数; 
 




 numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数; 
 




 minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义; 
 




 softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义; 
 




 lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列; 
 




 ================================================================================================================== 
 
 其中JedisPoolConfig对一些参数的默认设置如下: 
 
 testWhileIdle=true 
 
 minEvictableIdleTimeMills=60000 
 
 timeBetweenEvictionRunsMillis=30000 
 
 numTestsPerEvictionRun=-1