RedisTemplate連接不釋放、Redis斷線不重連問題、Redis連接數高飆升

  • 2021 年 8 月 12 日
  • 筆記

使用RedisTemplate操作Redis數據,但遇到網路斷線後不會重新連接 毫無頭緒  

一頓搗鼓 最終解決 整理如下 幫助更多的人

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做好判斷

如果幫到你了 良心三連哦

最後 我有一本秘籍…………