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

如果幫到你了 良心三連哦

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM