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

如果幫到你了 良心三連哦

最後 我有一本祕籍............