Redis 连接池配置

以下内容转自:http://blog.csdn.net/zhoubinbin111111/article/details/52370706

背景:发现项目在运行一段时间后老是莫名其妙的挂掉。查看错误日志,报too many open files,想到应该是有打开的资源忘记关闭。经过分析排查,发现Redis连接数飙升的同时服务器open files也飙升,因而确定是redis导致。当时redis未使用连接池,每次获取一个新的jedis对象,且在使用后没有关闭,Java gc 也来不及回收无引用的jedis对象,导致服务器open files达到上限。定位到问题所在后,就在网上找了一个简单的redis连接池配置,稍作修改,进而搞定问题。

redis连接池配置如下:

 

[java] view plain copy
 
  1. <span style="font-size:18px;">  
[java] view plain copy
 
  1. package com.ecshipper_manager.redis;  
  2.   
  3. import redis.clients.jedis.Jedis;  
  4. import redis.clients.jedis.JedisPool;  
  5. import redis.clients.jedis.JedisPoolConfig;  
  6.   
  7. public class RedisUtils {  
  8.   
  9.      //Redis服务器IP  
  10.      private static String ADDR = "127.0.0.1";  
  11.       //Redis的端口号  
  12.      private static int PORT = 6379;  
  13.      //可用连接实例的最大数目,默认值为8;  
  14.      //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。  
  15.      private static int MAX_ACTIVE = 1024;  
  16.      //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。  
  17.      private static int MAX_IDLE = 200;  
  18.      //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;  
  19.      private static int MAX_WAIT = 10000;  
  20.            
  21.      //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;  
  22.      private static boolean TEST_ON_BORROW = true;  
  23.      private static JedisPool jedisPool = null;  
  24.      /** 
  25.       * 初始化Redis连接池 
  26.       */  
  27.       static {  
  28.           try {  
  29.                JedisPoolConfig config = new JedisPoolConfig();  
  30.                config.setMaxTotal(MAX_ACTIVE);  
  31.                config.setMaxIdle(MAX_IDLE);  
  32.                config.setMaxWaitMillis(MAX_WAIT);  
  33.                config.setTestOnBorrow(TEST_ON_BORROW);  
  34.                jedisPool = new JedisPool(config, ADDR, PORT);  
  35.           } catch (Exception e) {  
  36.                e.printStackTrace();  
  37.           }  
  38.       }  
  39.         
  40.       /** 
  41.        * 获取Jedis实例 
  42.        * @return 
  43.        */  
  44.       public synchronized static Jedis getJedis() {  
  45.           try {  
  46.               if (jedisPool != null) {  
  47.                   Jedis resource = jedisPool.getResource();  
  48.                   return resource;  
  49.               } else {  
  50.                   return null;  
  51.               }  
  52.           } catch (Exception e) {  
  53.               e.printStackTrace();  
  54.               return null;  
  55.           }  
  56.       }  
  57.              
  58.       /** 
  59.        * 释放jedis资源 
  60.        * @param jedis 
  61.        */  
  62.        public static void returnResource(final Jedis jedis) {  
  63.            if (jedis != null) {  
  64.                 jedisPool.returnResourceObject(jedis);  
  65.            }  
  66.        }  
  67. }  
  68. </span>  

 

 

redis操作工具类

 

[java] view plain copy
 
  1. <span style="font-size:18px;">  
[java] view plain copy
 
  1. package com.ecshipper_manager.redis;  
  2.   
  3. import java.util.List;  
  4. import java.util.Set;  
  5. import org.springframework.stereotype.Component;  
  6. import redis.clients.jedis.Jedis;  
  7.   
  8. @Component("redisClient")  
  9. public class RedisClient {  
  10.   
  11.      /** 
  12.      * 通过key删除(字节) 
  13.      * @param key 
  14.      */  
  15.     public void del(byte [] key){  
  16.         Jedis jedis = RedisUtils.getJedis();  
  17.         jedis.del(key);  
  18.         RedisUtils.returnResource(jedis);  
  19.     }  
  20.     /** 
  21.      * 通过key删除 
  22.      * @param key 
  23.      */  
  24.     public void del(String key){  
  25.         Jedis jedis = RedisUtils.getJedis();  
  26.         jedis.del(key);  
  27.         RedisUtils.returnResource(jedis);  
  28.     }  
  29.   
  30.     /** 
  31.      * 添加key value 并且设置存活时间(byte) 
  32.      * @param key 
  33.      * @param value 
  34.      * @param liveTime 
  35.      */  
  36.     public void set(byte [] key,byte [] value,int liveTime){  
  37.         Jedis jedis = RedisUtils.getJedis();  
  38.         jedis.set(key, value);  
  39.         jedis.expire(key, liveTime);  
  40.         RedisUtils.returnResource(jedis);  
  41.     }  
  42.     /** 
  43.      * 添加key value 并且设置存活时间 
  44.      * @param key 
  45.      * @param value 
  46.      * @param liveTime 
  47.      */  
  48.     public void set(String key,String value,int liveTime){  
  49.         Jedis jedis = RedisUtils.getJedis();  
  50.         jedis.set(key, value);  
  51.         jedis.expire(key, liveTime);  
  52.         RedisUtils.returnResource(jedis);  
  53.     }  
  54.     /** 
  55.      * 添加key value 
  56.      * @param key 
  57.      * @param value 
  58.      */  
  59.     public void set(String key,String value){  
  60.         Jedis jedis = RedisUtils.getJedis();  
  61.         jedis.set(key, value);  
  62.         RedisUtils.returnResource(jedis);  
  63.     }  
  64.     /**添加key value (字节)(序列化) 
  65.      * @param key 
  66.      * @param value 
  67.      */  
  68.     public void set(byte [] key,byte [] value){  
  69.         Jedis jedis = RedisUtils.getJedis();  
  70.         jedis.set(key, value);  
  71.         RedisUtils.returnResource(jedis);  
  72.     }  
  73.     /** 
  74.      * 获取redis value (String) 
  75.      * @param key 
  76.      * @return 
  77.      */  
  78.     public String get(String key){  
  79.         Jedis jedis = RedisUtils.getJedis();  
  80.          String value = jedis.get(key);  
  81.         RedisUtils.returnResource(jedis);  
  82.         return value;  
  83.     }  
  84.     /** 
  85.      * 获取redis value (byte [] )(反序列化) 
  86.      * @param key 
  87.      * @return 
  88.      */  
  89.     public byte[] get(byte [] key){  
  90.         Jedis jedis = RedisUtils.getJedis();  
  91.         byte[] value = jedis.get(key);  
  92.         RedisUtils.returnResource(jedis);  
  93.         return value;  
  94.     }  
  95.   
  96.     /** 
  97.      * 通过正则匹配keys 
  98.      * @param pattern 
  99.      * @return 
  100.      */  
  101.     public Set<String> keys(String pattern){  
  102.         Jedis jedis = RedisUtils.getJedis();  
  103.         Set<String> value = jedis.keys(pattern);  
  104.         RedisUtils.returnResource(jedis);  
  105.         return value;  
  106.     }  
  107.   
  108.     /** 
  109.      * 检查key是否已经存在 
  110.      * @param key 
  111.      * @return 
  112.      */  
  113.     public boolean exists(String key){  
  114.         Jedis jedis = RedisUtils.getJedis();  
  115.         boolean value = jedis.exists(key);  
  116.         RedisUtils.returnResource(jedis);  
  117.         return value;  
  118.     }  
  119.       
  120.     /*******************redis list操作************************/  
  121.     /** 
  122.      * 往list中添加元素 
  123.      * @param key 
  124.      * @param value 
  125.      */  
  126.     public void lpush(String key,String value){  
  127.         Jedis jedis = RedisUtils.getJedis();  
  128.         jedis.lpush(key, value);  
  129.         RedisUtils.returnResource(jedis);  
  130.     }  
  131.       
  132.     public void rpush(String key,String value){  
  133.         Jedis jedis = RedisUtils.getJedis();  
  134.         jedis.rpush(key, value);  
  135.         RedisUtils.returnResource(jedis);  
  136.     }  
  137.       
  138.     /** 
  139.      * 数组长度 
  140.      * @param key 
  141.      * @return 
  142.      */  
  143.     public Long llen(String key){  
  144.         Jedis jedis = RedisUtils.getJedis();  
  145.         Long len = jedis.llen(key);  
  146.         RedisUtils.returnResource(jedis);  
  147.         return len;  
  148.     }  
  149.       
  150.     /** 
  151.      * 获取下标为index的value 
  152.      * @param key 
  153.      * @param index 
  154.      * @return 
  155.      */  
  156.     public String lindex(String key,Long index){  
  157.         Jedis jedis = RedisUtils.getJedis();  
  158.         String str = jedis.lindex(key, index);  
  159.         RedisUtils.returnResource(jedis);  
  160.         return str;  
  161.     }  
  162.       
  163.     public String lpop(String key){  
  164.         Jedis jedis = RedisUtils.getJedis();  
  165.         String str = jedis.lpop(key);  
  166.         RedisUtils.returnResource(jedis);  
  167.         return str;  
  168.     }  
  169.       
  170.     public List<String> lrange(String key,long start,long end){  
  171.         Jedis jedis = RedisUtils.getJedis();  
  172.         List<String> str = jedis.lrange(key, start, end);  
  173.         RedisUtils.returnResource(jedis);  
  174.         return str;  
  175.     }  
  176.     /*********************redis list操作结束**************************/  
  177.       
  178.     /** 
  179.      * 清空redis 所有数据 
  180.      * @return 
  181.      */  
  182.     public String flushDB(){  
  183.         Jedis jedis = RedisUtils.getJedis();  
  184.         String str = jedis.flushDB();  
  185.         RedisUtils.returnResource(jedis);  
  186.         return str;  
  187.     }  
  188.     /** 
  189.      * 查看redis里有多少数据 
  190.      */  
  191.     public long dbSize(){  
  192.         Jedis jedis = RedisUtils.getJedis();  
  193.         long len = jedis.dbSize();  
  194.         RedisUtils.returnResource(jedis);  
  195.         return len;  
  196.     }  
  197.     /** 
  198.      * 检查是否连接成功 
  199.      * @return 
  200.      */  
  201.     public String ping(){  
  202.         Jedis jedis = RedisUtils.getJedis();  
  203.         String str = jedis.ping();  
  204.         RedisUtils.returnResource(jedis);  
  205.         return str;  
  206.     }  
  207. }  
  208. </span>  

 

 

注:因为当时不想改动到业务逻辑代码,所以在RedisUtils中,每个方法都会获取一个jedis对象,并在方法结束前释放它,这样看起来代码比较丑,最好根据实际情况来权衡获取jedis对象和释放jedis的时机。

posted on 2017-06-11 22:45  傻瓜乐园  阅读(1654)  评论(0编辑  收藏  举报

导航