RedisTemplate连接不释放、Redis断线不重连问题、Redis连接数高飙升

使用RedisTemplate操作Redis数据,但遇到网络断线后不会重新连接 毫无头绪  

一顿捣鼓 最终解决 整理如下 帮助更多的人

查看redis连接数:# redis-cli info | grep connected        

connected_clients:5036

connected_slaves:0

1.起因

使用RedisTemplate 配置 开启了事务

enableTransactionSupport=true
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
		<property name="connectionFactory" ref="jedisConnectionFactory" />
		<!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!!  -->
		<property name="keySerializer" >
			<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
		</property>
		<property name="valueSerializer" >
			<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
		</property>
		<property name="hashKeySerializer">
			<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
		</property>
		<property name="hashValueSerializer">
			<bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
		</property>
		<!--开启事务  -->
		<property name="enableTransactionSupport" value="true"></property>
	</bean >

或者

2.发作

如果遇到网络闪断 而RedisTemplate没有释放连接的话

网络恢复后 Redis是无法重新连接上的

3.解决

方式一:手动判断 关闭连接 例如:

public Long length(String key) {
        try {
            return redisTemplate.opsForList().size(key);
        } catch (Exception e) {
            logger.error("",e);
        }finally {
            RedisConnectionUtils.unbindConnection(redisTemplate.getConnectionFactory());
        }
        return null;
    }

方式二:enableTransactionSupport设置为false(关闭事务)

4.优化 

如果一定要开启事务 

需要在service方法使用 @Transactional 注解 在调用 redisTemplate做好判断

转载请注明出处!!!

如果帮到你了 良心三连哦

最后 我有一本秘籍............ 

 

posted @ 2021-08-12 14:28  不再_单纯  阅读(4172)  评论(0编辑  收藏  举报