其实这个是引用自网友http://blog.csdn.net/tuposky/article/details/45340183,有2个版本,差别就是ReentrantLock和synchronized。另外原作者使用了断言,我觉得这个还是不用为好。


ReentrantLock版

import java.util.concurrent.locks.ReentrantLock;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;/*** Redis 工具类*/
public class JedisUtil {protected static ReentrantLock lockPool = new ReentrantLock();protected static ReentrantLock lockJedis = new ReentrantLock();protected static Logger logger = Logger.getLogger(JedisUtil.class);//Redis服务器IPprivate static String ADDR_ARRAY = "xxx.xxx.xxx.xxx";//Redis的端口号private static int PORT = 6379;//访问密码private static String AUTH = "http://blog.csdn.net/unix21";//可用连接实例的最大数目,默认值为8;//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。private static int MAX_ACTIVE = 8;//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。private static int MAX_IDLE = 8;//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;private static int MAX_WAIT = 3000;//超时时间private static int TIMEOUT = 10000;//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;private static boolean TEST_ON_BORROW = false;private static JedisPool jedisPool = null;/*** redis过期时间,以秒为单位*/public final static int EXRP_HOUR = 60 * 60;         //一小时public final static int EXRP_DAY = 60 * 60 * 24;      //一天public final static int EXRP_MONTH = 60 * 60 * 24 * 30;    //一个月/*** 初始化Redis连接池*/private static void initialPool() {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_ARRAY.split(",")[0], PORT, TIMEOUT, AUTH);} catch (Exception e) {logger.error("First create JedisPool error : " + e);try {//如果第一个IP异常,则访问第二个IPJedisPoolConfig 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_ARRAY.split(",")[1], PORT, TIMEOUT, AUTH);} catch (Exception e2) {logger.error("Second create JedisPool error : " + e2);}}}/*** 在多线程环境同步初始化*/private static void poolInit() {lockPool.lock();try {if (jedisPool == null) {initialPool();}} catch (Exception e) {e.printStackTrace();} finally {lockPool.unlock();}}public static Jedis getJedis() {lockJedis.lock();if (jedisPool == null) {poolInit();}Jedis jedis = null;try {if (jedisPool != null) {jedis = jedisPool.getResource();}} catch (Exception e) {logger.error("Get jedis error : " + e);} finally {returnResource(jedis);lockJedis.unlock();}return jedis;}/*** 释放jedis资源** @param jedis*/public static void returnResource(final Jedis jedis) {if (jedis != null && jedisPool != null) {jedisPool.returnResource(jedis);}}/*** 设置 String** @param key* @param value*/public synchronized static void setString(String key, String value) {try {value = StringUtils.isEmpty(value) ? "" : value;getJedis().set(key, value);} catch (Exception e) {logger.error("Set key error : " + e);}}/*** 设置 过期时间** @param key* @param seconds 以秒为单位* @param value*/public synchronized static void setString(String key, int seconds, String value) {try {value = StringUtils.isEmpty(value) ? "" : value;getJedis().setex(key, seconds, value);} catch (Exception e) {logger.error("Set keyex error : " + e);}}/*** 获取String值** @param key* @return value*/public synchronized static String getString(String key) {if (getJedis() == null || !getJedis().exists(key)) {return null;}return getJedis().get(key);}
}

synchronized版

import java.util.concurrent.locks.ReentrantLock;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;/*** Redis 工具类*/
public class JedisUtil {protected static ReentrantLock lockPool = new ReentrantLock();protected static ReentrantLock lockJedis = new ReentrantLock();protected static Logger logger = Logger.getLogger(JedisUtil.class);//Redis服务器IPprivate static String ADDR_ARRAY = "xxx.xxx.xxx.xxx";//Redis的端口号private static int PORT = 6379;//访问密码private static String AUTH = "http://blog.csdn.net/unix21";//可用连接实例的最大数目,默认值为8;//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。private static int MAX_ACTIVE = 8;//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。private static int MAX_IDLE = 8;//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;private static int MAX_WAIT = 3000;//超时时间private static int TIMEOUT = 10000;//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;private static boolean TEST_ON_BORROW = false;private static JedisPool jedisPool = null;/*** redis过期时间,以秒为单位*/public final static int EXRP_HOUR = 60 * 60;         //一小时public final static int EXRP_DAY = 60 * 60 * 24;      //一天public final static int EXRP_MONTH = 60 * 60 * 24 * 30;    //一个月/*** 初始化Redis连接池*/private static void initialPool() {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_ARRAY.split(",")[0], PORT, TIMEOUT, AUTH);} catch (Exception e) {logger.error("First create JedisPool error : " + e);try {//如果第一个IP异常,则访问第二个IPJedisPoolConfig 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_ARRAY.split(",")[1], PORT, TIMEOUT, AUTH);} catch (Exception e2) {logger.error("Second create JedisPool error : " + e2);}}}/*** 在多线程环境同步初始化*/private static synchronized void poolInit() {if (jedisPool == null) {  initialPool();}}/*** 同步获取Jedis实例* @return Jedis*/public synchronized static Jedis getJedis() {  if (jedisPool == null) {  poolInit();}Jedis jedis = null;try {  if (jedisPool != null) {  jedis = jedisPool.getResource(); }} catch (Exception e) {  logger.error("Get jedis error : "+e);}finally{returnResource(jedis);}return jedis;}  /*** 释放jedis资源** @param jedis*/public static void returnResource(final Jedis jedis) {if (jedis != null && jedisPool != null) {jedisPool.returnResource(jedis);}}/*** 设置 String** @param key* @param value*/public synchronized static void setString(String key, String value) {try {value = StringUtils.isEmpty(value) ? "" : value;getJedis().set(key, value);} catch (Exception e) {logger.error("Set key error : " + e);}}/*** 设置 过期时间** @param key* @param seconds 以秒为单位* @param value*/public synchronized static void setString(String key, int seconds, String value) {try {value = StringUtils.isEmpty(value) ? "" : value;getJedis().setex(key, seconds, value);} catch (Exception e) {logger.error("Set keyex error : " + e);}}/*** 获取String值** @param key* @return value*/public synchronized static String getString(String key) {if (getJedis() == null || !getJedis().exists(key)) {return null;}return getJedis().get(key);}
}

多线程

public class ClientThread extends Thread {int i = 0;public ClientThread(int i) {this.i = i;}public void run() {Date date = new Date();DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = format.format(date);JedisUtil.setString("foo", time);String foo = JedisUtil.getString("foo");      System.out.println("【输出>>>>】foo:" + foo + " 第:"+i+"个线程" +"当前时间:"+DateUtil.getNowTimeString());}
}

起10000个线程

public static void main(String[] args) {              for (int i = 0; i < 10000; i++) {          ClientThread t = new ClientThread(i);t.start();}}

运行非常稳定:

在单机4核普通PC机器测试下来10000条数据跑了2秒,性能还是不错的,没有报异常。

下面是一个处理不好的情况,就会报出种种异常,这种连接池一定要用多线程测试,不然线下没事,线上就会时不时的出问题:

Java的Redis连接池代码性能不错相关推荐

  1. Java的Redis连接池代码

    2019独角兽企业重金招聘Python工程师标准>>> 其实这个是引用自网友http://blog.csdn.net/tuposky/article/details/45340183 ...

  2. redis专题:redis键值设计、性能优化以及redis连接池配置

    文章目录 1.redis键值设计 ①:key设计规范 ②:value设计规范 2. 命令使用优化 3. redis连接池配置参数设计 4. redis连接池预热 5. redis的key过期删除策略 ...

  3. Java Redis 连接池 Jedis 工具类,java基础面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  4. java操作redis redis连接池

    redis作为缓存型数据库,越来越受到大家的欢迎,这里简单介绍一下java如何操作redis. 1.java连接redis java通过需要jedis的jar包获取Jedis连接. jedis-2.8 ...

  5. Java通过DBCP连接池方法实现JDBC代码案例

    Java和大数据系列 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等 ...

  6. Redis连接池配置详解

    连接池配置 文章目录 连接池配置 一.Redis连接池 二.jar包准备 三.编写代码配置,创建连接池,并调用处连接 总结 一.Redis连接池 与JDBC中在与数据库进行连接时耗时,从而需要引入连接 ...

  7. Java 中的连接池示例

    在此页面上,您将学习如何JDBC使用 Java 编程语言创建连接池.为了在我们的应用程序中创建连接池,Sun Microsystem 提供了一个接口 DataSource 通过使用接口 DataSou ...

  8. python redis连接池获取后关闭_python通过连接池连接redis,操作redis队列

    在每次使用redis都进行连接的话会拉低redis的效率,都知道redis是基于内存的数据库,效率贼高,所以每次进行连接比真正使用消耗的资源和时间还多.所以为了节省资源,减少多次连接损耗,连接池的作用 ...

  9. redis连接池操作

    /** * @类描述 redis 工具 * @功能名 POJO * @author zxf * @date 2014年11月25日 */ public final class RedisUtil { ...

最新文章

  1. java 反射获取父类的字段_java反射获取父类和子类字段值、赋值
  2. ArcEngine Hittest学习总结
  3. Maximum Element In A Stack 数据结构
  4. thymeleaf的具体语法
  5. pytorch教程龙曲良16-20
  6. 即将被AI人工智能淘汰的十个IT职业
  7. 21届校招应届生Offer薪资曝光:年薪35万+,倒挂老员工:我还没有应届生重要
  8. Struts2整合Spring方法及原理
  9. 艾索特DSP电脑调音软件
  10. cvc降噪和主动降噪_音频知识:CVC降噪和ANC主动降噪的区别和应用
  11. DSP28035的CLA使用经验
  12. 美国纽约大学超级计算机中心,美国纽约最好的八所大学介绍
  13. 安装完Fedora 18后需要做的事情
  14. 尚德机构第四季度营收5.688亿元 亏损大幅缩小
  15. 联通校园网避免检测随身wifi方法
  16. SQL 练习题标准答案(点个赞呀)
  17. C/C++实现你的浪漫表白:浪漫流星雨表白程序,
  18. 【转】微信小游戏开发总结
  19. 同济陈杰能计算机工程学院2016,陈杰
  20. LimeSDR mini实现GPS信号接收

热门文章

  1. C++ 三五法则,看看你能不能理解
  2. PCL基础4:PCLVisualizer可视化窗口显示
  3. 如何使用标准稳压器输出几百毫伏极低直流电压?
  4. CS131-专题7:图像特征(SIFT算法)
  5. 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第二章 深入理解Netd
  6. android百度api配置,Android Studio 配置使用百度api (附带简单样例)(示例代码)
  7. python库缺少pkg_resource_ImportError: No module named pkg_resources解决方案
  8. PCL点云配准(3)
  9. 剑指offer:面试题06. 从尾到头打印链表
  10. 2020考研 管理类联考数学 【题型分析及解题思路】