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做好判斷
如果幫到你了 良心三連哦
最後 我有一本秘籍…………