3分钟搞定springboot整合redis

3分钟搞定springboot整合redis,第1张

不多说直接上代码:

<!-- 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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9675025.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存