一、配置文件

  1. 1. db.properties配置文件
    #IP地址
  2. redis.ip = 127.0.0.1
  3. #端口号
  4. redis.port=
  5. #最大连接数
  6. redis.max.total=
  7. #最大空闲数
  8. redis.max.idle=
  9. #最小空闲数
  10. redis.min.idle=
  11. #效验使用可用连接
  12. redis.test.borrow=true
  13. #效验归还可用连接
  14. redis.test.return=false
  15.  
  16. 2. pom.xml文件
  1. <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
    </dependency>
  1.  

二、java代码

  1. public class RedisPool {
  2. private static JedisPool pool ; //jedis连接池
  3. private static Integer maxTotal = Integer.parseInt(PropertiesUtil.getProperty("redis.max.total","")); //最大连接数
  4. private static Integer maxIdle = Integer.parseInt(PropertiesUtil.getProperty("redis.max.idle","")); //最大空闲状态
  5. private static Integer minIdle =Integer.parseInt(PropertiesUtil.getProperty("redis.min.idle","")); //最小空闲状态
  6.  
  7. private static Boolean testOnBorrow =Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.borrow","true")); //验证从连接池拿出的jedis实例,一定可用
  8. private static Boolean testOnReturn =Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.return","true")); //验证还回连接池的jedis实例,一定可用
  9.  
  10. private static String redisIp =PropertiesUtil.getProperty("redis.ip"); //最小空闲状态
  11. private static Integer redisPort =Integer.parseInt(PropertiesUtil.getProperty("redis.port")); //最小空闲状态
  12.  
  13. private static void initPool(){
  14. JedisPoolConfig config = new JedisPoolConfig();
  15. config.setMaxTotal(maxTotal);
  16. config.setMaxIdle(maxIdle);
  17. config.setMinIdle(minIdle);
  18.  
  19. config.setTestOnBorrow(testOnBorrow);
  20. config.setTestOnReturn(testOnReturn);
  21.  
  22. config.setBlockWhenExhausted(true); //连接耗尽时是否阻塞,false抛出异常;true阻塞到超时。默认true
  23.  
  24. pool = new JedisPool(config,redisIp,redisPort,*);
  25. }
  26.  
  27. static{
  28. initPool();
  29. }
  30.  
  31. public static Jedis getJedis(){
  32. return pool.getResource();
  33. }
  34.  
  35. /**
  36. * redis不正常不可用,将其废弃,最新版本直接将此连接销毁jedis.close();
  37. * @param jedis
  38. */
  39. public static void returnBrokenResource(Jedis jedis){
  40. pool.returnBrokenResource(jedis); //最新版本已废弃
  41. }
  42.  
  43. public static void returnResource(Jedis jedis){
  44. pool.returnResource(jedis); //最新版本已废弃
  45. }
  46. }

三。redis相关类介绍

  (1)JedisPool

    JedisPool保证资源在一个可控范围内,并且提供了线程安全,Jedis连接就是资源,JedisPool管理的就是Jedis连接。此类只有三个方法普通方法,大量的构造器,构造器根据不同的连接配置信息,生成对应的资源池。可以很好地重复利用Jedis,减少new的次数,从而提高效率。

  (2)JedisPoolConfig

    资源池的配置信息,JedisPoolConfig只有一个构造器,大部分配置信息都在继承的类GenericObjectPoolConfigBaseObjectPoolConfig中。配置最大连接数,最大/小空闲等待数,是否效验生成/归还的连接有效等等。JedisPool其中JedisPoolConfig即是JedisPool构造器所要出入的配置对象,根据JedisPoolConfig配置信息,进行资源池管理。

基本配置如下:

  1. setBlockWhenExhausted(boolean blockWhenExhausted)
  2. 当池中的资源耗尽时是否进行阻塞,设置false直接报错,true表示会一直等待,直到有可用资源
  3.  
  4. setEvictionPolicyClassName(String evictionPolicyClassName)
  5. 设置逐出策略,默认策略为
  6. "org.apache.commons.pool2.impl.DefaultEvictionPolicy"
  7.  
  8. setFairness(boolean fairness)
  9. 当从池中获取资源或者将资源还回池中时 是否使用java.util.concurrent.locks.ReentrantLock.ReentrantLock 的公平锁机制,默认为false
  10.  
  11. setJmxEnabled
  12. 设置是否启用JMX,默认true
  13.  
  14. setJmxNameBase(String jmxNameBase)
  15. 设置JMX基础名
  16.  
  17. setJmxNamePrefix(String jmxNamePrefix)
  18. 设置JMX前缀名,默认值pool
  19.  
  20. setLifo(boolean lifo)
  21. 设置连接对象是否后进先出,默认true
  22.  
  23. setMaxIdle(int maxIdle)
  24. 设置最大空闲连接数,默认为8
  25.  
  26. setMaxTotal(int maxTotal)
  27. 设置最大连接数,默认18
  28.  
  29. setMaxWaitMillis(long maxWaitMillis)
  30. 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-
  31.  
  32. setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis)
  33. 设置连接最小的逐出间隔时间,默认1800000毫秒
  34.  
  35. setMinIdle(int minIdle)
  36. 设置无连接时池中最小的连接个数,默认连接0
  37.  
  38. setNumTestsPerEvictionRun(int numTestsPerEvictionRun)
  39. 每次逐出检查时,逐出连接的个数
  40.  
  41. setSoftMinEvictableIdleTimeMillis(softMinEvictableIdleTimeMillis);
  42. 对象空闲多久后逐出, 当空闲时间>该值 空闲连接>最大空闲数 时直接逐出,不再根据MinEvictableIdleTimeMillis判断
  43.  
  44. setTestOnBorrow(boolean testOnBorrow)
  45. 从池中获取连接时是否测试连接的有效性,默认false
  46.  
  47. setTestOnCreate(boolean testOnCreate)
  48. 在连接对象创建时测试连接对象的有效性,默认false
  49.  
  50. setTestOnReturn(boolean testOnReturn)
  51. 在连接对象返回时,是否测试对象的有效性,默认false
  52.  
  53. setTestWhileIdle(boolean testWhileIdle)
  54. 在连接池空闲时是否测试连接对象的有效性,默认false
  55.  
  56. setTimeBetweenEvictionRunsMillis(
  57. long timeBetweenEvictionRunsMillis)
  58. 设置连接对象有效性扫描间隔,设置为-,则不运行逐出线程

  (3)Jedis

  Jedis是Redis官方推荐的Java连接开发工具。要在Java开发中使用好Redis中间件。Jedis有大量的方法,都是进行redis数据库的crud操作。Jedis是有JedisPool连接池创建的。

  1. import com.mmall.common.RedisPool;
  2. import lombok.extern.slf4j.Slf4j;
  3. import redis.clients.jedis.Jedis;
  4.  
  5. /**
  6. * 封装单机redis常用API方法
  7. */
  8. @Slf4j
  9. public class RedisPoolUtil {
  10.  
  11. /**
  12. * 设置对应key的有效期
  13. * @param key
  14. * @param exTime 有效期,单位秒
  15. * @return
  16. */
  17. public static Long expire(String key, int exTime){
  18. Jedis jedis = null;
  19. Long result = null;
  20. try{
  21. jedis = RedisPool.getJedis();
  22. result = jedis.expire(key,exTime);
  23. }catch (Exception e){
  24. log.error("set key:{} exTime:{} value:{} error",key,exTime,e);
  25. RedisPool.returnBrokenResource(jedis);
  26. return result;
  27. }
  28. RedisPool.returnResource(jedis);
  29. return result;
  30. }
  31.  
  32. /**
  33. * string 添加,存在有效期exTime
  34. * @param key 键
  35. * @param value 值
  36. * @param exTime 有效期,单位秒
  37. * @return
  38. */
  39. public static String setEx(String key, String value, int exTime){
  40. Jedis jedis = null;
  41. String result = null;
  42. try{
  43. jedis = RedisPool.getJedis();
  44. result = jedis.setex(key,exTime,value);
  45. }catch (Exception e){
  46. log.error("set key:{} exTime:{} value:{} error",key,exTime,value,e);
  47. RedisPool.returnBrokenResource(jedis);
  48. return result;
  49. }
  50. RedisPool.returnResource(jedis);
  51. return result;
  52. }
  53.  
  54. /**
  55. * string 添加
  56. * @param key
  57. * @param value
  58. * @return
  59. */
  60. public static String set(String key, String value){
  61. Jedis jedis = null;
  62. String result = null;
  63. try{
  64. jedis = RedisPool.getJedis();
  65. result = jedis.set(key,value);
  66. }catch (Exception e){
  67. log.error("set key:{} value:{} error",key,value,e);
  68. RedisPool.returnBrokenResource(jedis);
  69. return result;
  70. }
  71. RedisPool.returnResource(jedis);
  72. return result;
  73. }
  74.  
  75. /**
  76. * string 获取
  77. * @param key
  78. * @return
  79. */
  80. public static String get(String key){
  81. Jedis jedis = null;
  82. String result = null;
  83. try{
  84. jedis = RedisPool.getJedis();
  85. result = jedis.get(key);
  86. }catch (Exception e){
  87. log.error("get key:{} error",key,e);
  88. RedisPool.returnBrokenResource(jedis);
  89. return result;
  90. }
  91. RedisPool.returnResource(jedis);
  92. return result;
  93. }
  94.  
  95. /**
  96. * stirng 删除
  97. * @param key
  98. * @return
  99. */
  100. public static Long del(String key){
  101. Jedis jedis = null;
  102. Long result = null;
  103. try{
  104. jedis = RedisPool.getJedis();
  105. result = jedis.del(key);
  106. }catch (Exception e){
  107. log.error("get key:{} error",key,e);
  108. RedisPool.returnBrokenResource(jedis);
  109. return result;
  110. }
  111. RedisPool.returnResource(jedis);
  112. return result;
  113. }
  114. }

redis单机连接池的更多相关文章

  1. redis运用连接池报错解决

    redis使用连接池报错解决redis使用十几小时就一直报异常 redis.clients.jedis.exceptions.JedisConnectionException: Could not g ...

  2. nodejs + redis/mysql 连接池问题

    nodejs + redis/mysql 连接池问题 需不需要连接池 连接池的作用主要是较少每次临时建立连接所带来的开销.初步一看,nodejs运行单线程上,它不能同时使用多个连接,乍一看是不需要连接 ...

  3. Redis Java连接池调研

    Redis Java连接池调研 线上服务,由于压力大报错RedisTimeOut,但是需要定位到底问题出现在哪里? 查看Redis慢日志,slowlog get 发现耗时最大的也是11000us也就是 ...

  4. python redis之连接池的原理

    python redis之连接池的原理 转载地址 什么是连接池 通常情况下, 当我们需要做redis操作时, 会创建一个连接, 并基于这个连接进行redis操作, 操作完成后, 释放连接, 一般情况下 ...

  5. Redis 配置连接池,redisTemplate 操作多个db数据库,切换多个db,解决JedisConnectionFactory的设置连接方法过时问题。(转)

    环境 springmvc jdk1.8 maven redis.properties配置文件 #redis setting redis.host=localhost redis.port=6379 r ...

  6. Redis缓存连接池管理

    import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.Assert;import ...

  7. java客户端Jedis操作Redis Sentinel 连接池

    pom配置: <dependency> <groupId>org.springframework.data</groupId> <artifactId> ...

  8. redis mysql 连接池 之 golang 实现

    1 mysql 连接池代码 package lib import ( "database/sql" "fmt" "strconv" &quo ...

  9. python操作Redis安装、支持存储类型、普通连接、连接池

    一.python操作redis安装和支持存储类型 安装redis模块 pip3 install redis 二.Python操作Redis之普通连接 redis-py提供两个类Redis和Strict ...

随机推荐

  1. HTML基础要点归纳

    一.开发环境 常用的HTML编辑器有Sublime Text.Hbuild.Dreamweare.以及vs code.pycharm等都可以.我目前在用的就是Sublime text3和Hbuild两 ...

  2. 使用zabbix-proxy

    事情背景: vt上两个vps,只提供ipv6.(因为便宜嘛).而我的zabbix服务器在腾讯云.它丫的没有ipv6. 那么我没法监控它们了呀... 这咋个行呢? 想办法... 我还有另外的vps 可以 ...

  3. python 多线程_thread

    import _thread import time def print_time(threadName, delay, iterations): start = int(time.time()) , ...

  4. ThreadGroupAPI

    官方解释 public class ThreadGroup extends Object implements Thread.UncaughtExceptionHandler A thread gro ...

  5. redis详解之cluster模式部署

    一.环境说明 1.Operation OS:CentOS7.22.ruby version >= 2.2.23.openssl zlib gcc>=4.8.5 二.开始部署 1.安装rub ...

  6. 多进程之间的互斥信号量的实现(Linux和windows跨平台)

    最近工作中遇到了一些关于文件读取权限的问题.当一个程序中对一个固定名称的文件做了读写的操作的时候,外界通过并发式的调用这个应用的时候,可能存在多个进程同时去操作这个文件,这个时候可能会造成调用失败的问 ...

  7. 性能分析 | 线上CPU100%排查

    不知道在大家面试中,有没有遇到这个问题: 生产服务器上部署了几个java程序,突然出现了CPU100%的异常告警,你如何定位出问题呢? 这个问题分为两版回答! 高调版 对不起,我是做研发的,这个问题在 ...

  8. CentOS7重启后resolv.conf被重置的解决方案

    近期在修改一台CentOS7服务器的dns时发现只要重启服务器DNS就会被强制还原,解决方案如下: 1.首先在网卡设置中修改NM_CONTROLLED的值: 修改文件/etc/sysconfig/ne ...

  9. 为TMenuItem增加指针Data属性

    Delphi的有些组件中都包含.Data属性,比如TTreeNode,.Data属性可以认为是一个指针,可以指向任何类或者结构,方便后续操作. 但是TMenuItem没有.Data属性,下面介绍最简单 ...

  10. haproxy配置文件实例

    [root@kube-node1 ~]# cat /etc/haproxy/haproxy.cfg global log /dev/log local0 log /dev/log local1 not ...