2015-03-02 176 views
3

我需要爲每個請求(寫/讀)創建RedisTemplate。 ConnectionFactory是JedisConnectionFactory如何安全地處理Spring RedisTemplate?

JedisConnectionFactory factory=new 
    JedisConnectionFactory(RedisSentinelConfiguration,JedisPoolConfig); 

有一次,我做操作與RedisTemplate.opsForHash/opsForValue,如何處置模板安全,使連接返回到JedisPool。

截至目前,我這樣做與

template.getConnectionFactory().getConnection().close(); 

這是正確的方式?

回答

3

RedisTemplate取自RedisConnectionFactory的連接,並聲明它返回到池中,或在命令執行後正確關閉,具體取決於所提供的配置。 (請參閱:JedisConnection#close()

通過getConnectionFactory().getConnection().close();手動關閉連接將獲取新的連接並立即關閉。

所以,如果你想有更多的控制,你可以獲取連接,執行一些操作,後來關閉

RedisConnection connection = template.getConnectionFactory().getConnection(); 
connection... // call ops as required 
connection.close(); 

或使用RedisTemplate.execute(...)RedisCallback一起,這樣你就不必擔心關於獲取和返回連接。

template.execute(new RedisCallback<Void>() { 

    @Override 
    public Void doInRedis(RedisConnection connection) throws DataAccessException { 
    connection... // call ops as required 
    return null; 
    }}); 
+0

我只對opsForHash/opsForValue/execute進行操作。所以我沒有明確地關閉連接? – 2015-03-03 07:47:29

+0

是的,不需要明確關閉它。 – 2015-03-03 08:21:32

+0

我在從池中獲取連接時遇到異常。我認爲這可能是因爲RedisTemplate沒有被正確銷燬/處置。現在我沒有面對這個連接問題。我已經刪除了你已經回答的線路。 – 2015-03-03 09:50:32