2016-03-02 176 views
1

我正在通過Jetty/CometD運行長時間運行的Web服務,並且我正在使用Redisson庫連接到redis。我正在使用Singleton模式來獲取我的RedissonClient /連接,我不確定這是否是最好的方法。Singleton模式是RedissonClient的一個很好的用例嗎?

類看起來是這樣的:

public class RedisClient { 
    // singleton instance of our RedisonClient/connection 
    private static RedissonClient _redissonInstance; 
    public static String REDIS_HOST = "my.redishost.com:6379"; 


    private static RedissonClient setupRedis() { 
     org.redisson.Config config = new org.redisson.Config(); 

     config.useSingleServer() 
       .setAddress(REDIS_HOST) 
       .setConnectionPoolSize(200); 

     return Redisson.create(config); 
    } 

    public static RedissonClient getRedis() { 
     if (_redissonInstance == null) { 
      _redissonInstance = setupRedis(); 
     } 
     return _redissonInstance; 
    } 

    public static void setRedisHost(String redisHost) { 
     _logger.warn("Setting REDIS_HOST to: " + redisHost); 
     REDIS_HOST = redisHost; 
    } 
} 
+0

我不能想到任何使用情況下,辛格爾頓將是一個好主意。 – duffymo

+0

爲什麼單身人士在Java中不是個好主意?似乎我閱讀的越多,看起來越不推薦(仍然在學習Java btw) – giantNinja

+0

他們在任何語言中都是個壞主意。這就是爲什麼他們不被推薦。 Google已經編寫了一些工具來檢測它們是否被淘汰:http://googlecode.blogspot.com/2007/07/google-singleton-detector-released.html – duffymo

回答

3

我會說,這是一個壞主意。我不認爲單身是一個好主意,但即便如此,這也不是一個好辦法。你的代碼不是線程安全的,好像你想支持多個主機一樣。

如果你真的不想通過周圍的Redis的客戶端的每個組件和你的主機是不會改變的和想要的東西快速和骯髒試試這個:

public class Redis { 
    public static final RedissonClient CLIENT; 
    static { 
     Config config = new Config(); 
     config.useSingleServer() 
      .setAddress("my.redishost.com:6379") 
      .setConnectionPoolSize(200); 
     CLIENT = Redisson.create(config); 
    } 
} 

這具有的好處在獲取引用時不需要任何同步,就是線程安全的。

+0

這不是我想要支持多個主機,而是從Maven配置文件屬性 - > web.xml init-param中設置主機,這是servlet初始化時獲得的,並且基於那。我有兩個redis主機,一個用於開發,另一個用於生產,我不想在測試時使用生產redis主機。不確定最好的方式去做,但感謝回覆並指出線程安全問題 – giantNinja

相關問題