關於jedis的使用小結

1.pom.xml中依賴以下:
java

    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.6.1</version>
   </dependency>

2.jedis pool中ping的產生redis

線上storm的bolt使用jedis pool操做redis,高峯時壓力一直比較大,每s處理量多達10w/s,redis持續跑滿(單線程,cpu100%),對monitor數據分析,發現50%以上的都是ping操做,ping是用來檢測redis是否可用的操做,在jedis pool中由兩個參數控制:apache

setTestOnBorrow //獲取鏈接時是否觸發ping
setTestOnReturn //釋放鏈接時是否觸發ping

默認兩個值都是true的,設置爲false便可ssh

3.獲取不到資源時jedis的處理ide

1)當setBlockWhenExhausted設置爲true(默認即爲true)時,阻塞setMaxWaitMillis時間(默認爲-1,會一直阻塞),超過期間限制則拋出異常:函數

Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
  at redis.clients.util.Pool.getResource(Pool.java:53)
  at redis.clients.jedis.JedisPool.getResource(JedisPool.java:99)
  at main.java.JedisPoolTest.main(JedisPoolTest.java:20)
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
  at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:442)
  at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:360)
  at redis.clients.util.Pool.getResource(Pool.java:51)
  ... 2 more

2)當setBlockWhenExhausted(false);設置爲false時,直接拋出異常,不會阻塞線程

4.jedis的默認db都是0,能夠經過構造函數的參數進行設置orm

5.防止資源泄露,在catch異常的時候使用JedisPool.returnBrokenResource釋放鏈接,能夠使用JedisPool.getNumActive獲取當前的活動鏈接數xml

6.pool的初始化常用靜態代碼塊完成ip

7.sharding的模式也是支持pipline的

附1個jedissharding pipeline的例子:

package main.java;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPipeline;
import java.util.List;
import java.util.LinkedList;
public class JedisPoolTest {
  private static ShardedJedisPool pool = null;
  private static ShardedJedisPipeline pip = null;
   public static void main(String[] args) {       
      JedisPoolConfig jc = new JedisPoolConfig();
      jc.setBlockWhenExhausted(false);
      jc.setMaxIdle(8); 
      jc.setMaxTotal(20); 
      jc.setTestOnBorrow(false);
      jc.setTestOnReturn(false);
      jc.setMaxWaitMillis(-1);
      JedisShardInfo jedisShardInfo1 = new JedisShardInfo("192.168.101.42",6379);
      JedisShardInfo jedisShardInfo2 = new JedisShardInfo("192.168.101.42",6380);
      List<JedisShardInfo> list = new LinkedList<JedisShardInfo>();  
      list.add(jedisShardInfo1);
      list.add(jedisShardInfo2);
      pool = new ShardedJedisPool(jc, list);
      ShardedJedis jedis = pool.getResource();
      pip = jedis.pipelined();
      long start = System.currentTimeMillis();
      for(int i = 0;i <= 100;i++){          
         String key = "shardpool" + String.valueOf(i);
         pip.del(key);  
         pip.set(key, "test");   
      }
     pool.returnResource(jedis); 
     pip.syncAndReturnAll();
      long end = System.currentTimeMillis();
      long elapse = end - start;
      System.out.println("10000 itmes elapse time is " + String.valueOf(elapse));
   }
}
相關文章
相關標籤/搜索