不多说直接上代码:
<!-- redis -->
<dependency>
<groupId>orgspringframeworkboot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>redisclients</groupId>
<artifactId>jedis</artifactId>
</exclusion>
<exclusion>
<groupId>iolettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加jedis客户端 -->
<dependency>
<groupId>redisclients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!--spring20集成redis所需common-pool2-->
<!-- 必须加上,jedis依赖此 -->
<dependency>
<groupId>orgapachecommons</groupId>
<artifactId>commons-pool2</artifactId>
<version>250</version>
</dependency>
<!-- 将作为Redis对象序列化器 -->
<dependency>
<groupId>comalibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1247</version>
</dependency>
#Matser的ip地址
redishostName=1721644148
#端口号
redisport=6379
#如果有密码
redispassword=
#客户端超时时间单位是毫秒 默认是2000
redistimeout=10000
#最大空闲数
redismaxIdle=300
#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 24以后用redismaxTotal
#redismaxActive=600
#控制一个pool可分配多少个jedis实例,用来替换上面的redismaxActive,如果是jedis 24以后用该属性
redismaxTotal=1000
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redismaxWaitMillis=1000
#连接的最小空闲时间 默认1800000毫秒(30分钟)
redisminEvictableIdleTimeMillis=300000
#每次释放连接的最大数目,默认3
redisnumTestsPerEvictionRun=1024
#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
redistimeBetweenEvictionRunsMillis=30000
#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
redistestOnBorrow=true
#在空闲时检查有效性, 默认false
redistestWhileIdle=true
package comjunsidemoconfig;
import orgspringframeworkbeansfactoryannotationValue;
import orgspringframeworkcontextannotationBean;
import orgspringframeworkcontextannotationConfiguration;
import orgspringframeworkcontextannotationPropertySource;
import orgspringframeworkdataredisconnectionRedisConnectionFactory;
import orgspringframeworkdataredisconnectionjedisJedisConnectionFactory;
import orgspringframeworkdatarediscoreRedisTemplate;
import orgspringframeworkdataredisserializerGenericJackson2JsonRedisSerializer;
import orgspringframeworkdataredisserializerStringRedisSerializer;
import comjunsidemoutilsRedisUtil;
import redisclientsjedisJedisPoolConfig;
/
Redis配置类
@author pzx
2019年6月8日
/
@Configuration
@PropertySource("classpath:redisproperties")
public class RedisConfig {
@Value("${redismaxIdle}")
private Integer maxIdle;
@Value("${redismaxTotal}")
private Integer maxTotal;
@Value("${redismaxWaitMillis}")
private Integer maxWaitMillis;
@Value("${redisminEvictableIdleTimeMillis}")
private Integer minEvictableIdleTimeMillis;
@Value("${redisnumTestsPerEvictionRun}")
private Integer numTestsPerEvictionRun;
@Value("${redistimeBetweenEvictionRunsMillis}")
private long timeBetweenEvictionRunsMillis;
@Value("${redistestOnBorrow}")
private boolean testOnBorrow;
@Value("${redistestWhileIdle}")
private boolean testWhileIdle;
@Value("${springredisclusternodes}")
private String clusterNodes;
@Value("${springredisclustermax-redirects}")
private Integer mmaxRedirectsac;
/
JedisPoolConfig 连接池
@return
/
@Bean
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大空闲数
jedisPoolConfigsetMaxIdle(maxIdle);
// 连接池的最大数据库连接数
jedisPoolConfigsetMaxTotal(maxTotal);
// 最大建立连接等待时间
jedisPoolConfigsetMaxWaitMillis(maxWaitMillis);
// 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
jedisPoolConfigsetMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
// 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
jedisPoolConfigsetNumTestsPerEvictionRun(numTestsPerEvictionRun);
// 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
jedisPoolConfigsetTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
// 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
jedisPoolConfigsetTestOnBorrow(testOnBorrow);
// 在空闲时检查有效性, 默认false
jedisPoolConfigsetTestWhileIdle(testWhileIdle);
return jedisPoolConfig;
}
/
@param jedisPoolConfig
@return
/
@Bean
public JedisConnectionFactory JedisConnectionFactory(JedisPoolConfig jedisPoolConfig){
JedisConnectionFactory JedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);
//连接池
JedisConnectionFactorysetPoolConfig(jedisPoolConfig);
//IP地址
JedisConnectionFactorysetHostName("1721644148");
//端口号
JedisConnectionFactorysetPort(6379);
//如果Redis设置有密码
//JedisConnectionFactorysetPassword(password);
//客户端超时时间单位是毫秒
JedisConnectionFactorysetTimeout(5000);
return JedisConnectionFactory;
}
/
实例化 RedisTemplate 对象
@return
/
@Bean
public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
return redisTemplate;
}
/
设置数据存入 redis 的序列化方式,并开启事务
@param redisTemplate
@param factory
/
private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
//如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!
redisTemplatesetKeySerializer(new StringRedisSerializer());
redisTemplatesetHashKeySerializer(new StringRedisSerializer());
redisTemplatesetHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplatesetValueSerializer(new GenericJackson2JsonRedisSerializer());
// 开启事务
redisTemplatesetEnableTransactionSupport(true);
redisTemplatesetConnectionFactory(factory);
}
@Bean(name = "redisUtil")
public RedisUtil redisUtil(RedisTemplate<String, Object> redisTemplate) {
RedisUtil redisUtil = new RedisUtil();
redisUtilsetRedisTemplate(redisTemplate);
return redisUtil;
}
}
在项目中尝试使用了几种开源的数据库连接池实现。一种是dbcp,一种是c3p0,还有一种是proxool,这几种数据库连接池都可以很容易的在Spring配置起来。性能总体上上感觉dbcp为最优,因为稳定性和并发性都是我的项目需要的。
项目中经过反复测试,如果web server和数据库server不是同一个机器的话,在断网时间比较短的时间内三种数据库连接池都能较好的重连,但是在断网时间超过8个钟头 proxool就不能恢复工作了。但是dbcp却能很快的重新连接。实际生产环境中稳定性和总体性能是最重要的,都需要做相应的测试才能放心的让系统上生产线。
这里给出项目中数据库连接池配置:
dbcp的jndi:13 4 java:comp/env/jdbc/mysql5 6 proxool(proxool-090RC1)的配置: commysqljdbcDriver jdbc:mysql://ip:3306/dbnameuseUnicode=true&characterEncoding=utf8&autoReconnect=true user password 500 15000 select CURRENT_DATE true mysqlProxoolDataSource 1000 false 建议使用DBCP,配置在tomcat中,然后在spring中使用jndi的形式获取。 c3p0(c3p0-090): 1 3 4 commysqljdbcDriver 5 6 7 jdbc:mysql://1921680225:3306/sendinmdbuseUnicode=true&characterEncoding=utf8&autoReconnect=true 8 9 10 11 12 13 14 15 16 10017 18 19 5020 21 22 10023 24 25 100026 27 28 3029 30 直接copy & paste到spring配置文件里就可以使用了。 配置一些额外的tomcat 的DBCP连接池参数,也可以更好的使用到类似proxool提供的功能,只是dbcp更加稳定而已。tomcat/conf/contextxml中插入一个Resource元素: 解释一下以下这些参数的含义:
validationQuery = "select current_date()"
testOnBorrow = "true"
testOnReturn = "false"
testWhileIdle = "true"
当 从池中获取一个Connection后使用 select current_date() 来测试该数据库连接的可用性,如果SQL语句返回结果则认为是一个有效的连接,否则将继续测试知道可以拿到有效的连接。当返回Connection给池的时候不进行验证,但是Connection空闲的时候就要进行认证。
timeBetweenEvictionRunsMillis = "15000"
DBCP 清空线程睡眠的间隙,如值为负数则不运行该线程
numTestsPerEvictionRun = "10"
清空线程每次验证的连接对象个数
minEvictableIdleTimeMillis = "600000" Connection对象可以在池中空闲的最小时间,单位为毫秒详细配置请访问
<property name="validationQuery" value="SELECT 'x'" />
这句话没有执行成功。这写法顶多是mysql能成功,你如果是oracle,要写一个oracle能通过的语句,比如select count() from xxx
以上就是关于3分钟搞定springboot整合redis全部的内容,包括:3分钟搞定springboot整合redis、开源的数据库连接池和普通的数据库连接池有什么区别、使用druid,启动时报错 validateConnection false等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)