Redis 连接池配置
来源:互联网 发布:php登陆页面 编辑:程序博客网 时间:2024/06/05 03:08
背景:发现项目在运行一段时间后老是莫名其妙的挂掉。查看错误日志,报too many open files,想到应该是有打开的资源忘记关闭。经过分析排查,发现redis连接数飙升的同时服务器open files也飙升,因而确定是redis导致。当时redis未使用连接池,每次获取一个新的jedis对象,且在使用后没有关闭,java gc 也来不及回收无引用的jedis对象,导致服务器open files达到上限。定位到问题所在后,就在网上找了一个简单的redis连接池配置,稍作修改,进而搞定问题。
redis连接池配置如下:
<span style="font-size:18px;">
package com.ecshipper_manager.redis;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;public class RedisUtils { //Redis服务器IP private static String ADDR = "127.0.0.1"; //Redis的端口号 private static int PORT = 6379; //可用连接实例的最大数目,默认值为8; //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。 private static int MAX_ACTIVE = 1024; //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。 private static int MAX_IDLE = 200; //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException; private static int MAX_WAIT = 10000; //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的; private static boolean TEST_ON_BORROW = true; private static JedisPool jedisPool = null; /** * 初始化Redis连接池 */ static { try { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(MAX_ACTIVE); config.setMaxIdle(MAX_IDLE); config.setMaxWaitMillis(MAX_WAIT); config.setTestOnBorrow(TEST_ON_BORROW); jedisPool = new JedisPool(config, ADDR, PORT); } catch (Exception e) { e.printStackTrace(); } } /** * 获取Jedis实例 * @return */ public synchronized static Jedis getJedis() { try { if (jedisPool != null) { Jedis resource = jedisPool.getResource(); return resource; } else { return null; } } catch (Exception e) { e.printStackTrace(); return null; } } /** * 释放jedis资源 * @param jedis */ public static void returnResource(final Jedis jedis) { if (jedis != null) { jedisPool.returnResourceObject(jedis); } }}</span>
<span style="font-size:18px;">
package com.ecshipper_manager.redis;import java.util.List;import java.util.Set;import org.springframework.stereotype.Component;import redis.clients.jedis.Jedis;@Component("redisClient")public class RedisClient { /** * 通过key删除(字节) * @param key */ public void del(byte [] key){ Jedis jedis = RedisUtils.getJedis(); jedis.del(key); RedisUtils.returnResource(jedis); } /** * 通过key删除 * @param key */ public void del(String key){ Jedis jedis = RedisUtils.getJedis(); jedis.del(key); RedisUtils.returnResource(jedis); } /** * 添加key value 并且设置存活时间(byte) * @param key * @param value * @param liveTime */ public void set(byte [] key,byte [] value,int liveTime){ Jedis jedis = RedisUtils.getJedis(); jedis.set(key, value); jedis.expire(key, liveTime); RedisUtils.returnResource(jedis); } /** * 添加key value 并且设置存活时间 * @param key * @param value * @param liveTime */ public void set(String key,String value,int liveTime){ Jedis jedis = RedisUtils.getJedis(); jedis.set(key, value); jedis.expire(key, liveTime); RedisUtils.returnResource(jedis); } /** * 添加key value * @param key * @param value */ public void set(String key,String value){ Jedis jedis = RedisUtils.getJedis(); jedis.set(key, value); RedisUtils.returnResource(jedis); } /**添加key value (字节)(序列化) * @param key * @param value */ public void set(byte [] key,byte [] value){ Jedis jedis = RedisUtils.getJedis(); jedis.set(key, value); RedisUtils.returnResource(jedis); } /** * 获取redis value (String) * @param key * @return */ public String get(String key){ Jedis jedis = RedisUtils.getJedis(); String value = jedis.get(key); RedisUtils.returnResource(jedis); return value; } /** * 获取redis value (byte [] )(反序列化) * @param key * @return */ public byte[] get(byte [] key){ Jedis jedis = RedisUtils.getJedis(); byte[] value = jedis.get(key); RedisUtils.returnResource(jedis); return value; } /** * 通过正则匹配keys * @param pattern * @return */ public Set<String> keys(String pattern){ Jedis jedis = RedisUtils.getJedis(); Set<String> value = jedis.keys(pattern); RedisUtils.returnResource(jedis); return value; } /** * 检查key是否已经存在 * @param key * @return */ public boolean exists(String key){ Jedis jedis = RedisUtils.getJedis(); boolean value = jedis.exists(key); RedisUtils.returnResource(jedis); return value; } /*******************redis list操作************************/ /** * 往list中添加元素 * @param key * @param value */ public void lpush(String key,String value){ Jedis jedis = RedisUtils.getJedis(); jedis.lpush(key, value); RedisUtils.returnResource(jedis); } public void rpush(String key,String value){ Jedis jedis = RedisUtils.getJedis(); jedis.rpush(key, value); RedisUtils.returnResource(jedis); } /** * 数组长度 * @param key * @return */ public Long llen(String key){ Jedis jedis = RedisUtils.getJedis(); Long len = jedis.llen(key); RedisUtils.returnResource(jedis); return len; } /** * 获取下标为index的value * @param key * @param index * @return */ public String lindex(String key,Long index){ Jedis jedis = RedisUtils.getJedis(); String str = jedis.lindex(key, index); RedisUtils.returnResource(jedis); return str; } public String lpop(String key){ Jedis jedis = RedisUtils.getJedis(); String str = jedis.lpop(key); RedisUtils.returnResource(jedis); return str; } public List<String> lrange(String key,long start,long end){ Jedis jedis = RedisUtils.getJedis(); List<String> str = jedis.lrange(key, start, end); RedisUtils.returnResource(jedis); return str; } /*********************redis list操作结束**************************/ /** * 清空redis 所有数据 * @return */ public String flushDB(){ Jedis jedis = RedisUtils.getJedis(); String str = jedis.flushDB(); RedisUtils.returnResource(jedis); return str; } /** * 查看redis里有多少数据 */ public long dbSize(){ Jedis jedis = RedisUtils.getJedis(); long len = jedis.dbSize(); RedisUtils.returnResource(jedis); return len; } /** * 检查是否连接成功 * @return */ public String ping(){ Jedis jedis = RedisUtils.getJedis(); String str = jedis.ping(); RedisUtils.returnResource(jedis); return str; }}</span>
0 0
- Redis 连接池配置
- Redis 连接池配置
- redis连接池配置
- Redis连接池参数配置
- SpringBoot配置Redis连接池
- java配置和使用redis连接池
- redis配置远程连接
- Python连接Redis连接配置
- Python连接Redis连接配置
- Python连接Redis连接配置
- Python连接Redis连接配置
- spring Boot redis连接池配置,Spring Session配置
- spring Boot redis连接池配置,Spring Session配置
- Python连接Redis配置详解
- redis之如何配置jedisPool参数 jedis连接池参数
- golang redis连接池
- redis 连接池类
- redis连接池用法
- 目标检测简要综述
- JS实现各种复制到剪贴板
- JAVA反射之方法反射的基本操作
- 过滤器、监听器、拦截器的区别
- Kerberos原理解析
- Redis 连接池配置
- Galera Cluster for MySQL
- xcode设置全局宏,修改NSLog打印格式
- 新站应该更注重站内优化
- 获取应用的versioncode和versionname
- H5 移动端 时间选择器
- 从零开始搭建一个简易的服务器(一)
- Java的synchronized用法
- css3中的box-shadow(阴影)使用说明和兼容性问题