Singleton模式是RedissonClient的一个很好的用例吗?

时间:2016-03-02 18:19:41

标签: java redis redisson

我正在通过Jetty / CometD运行一个长期运行的Web服务,我正在使用Redisson库连接到redis。我正在使用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;
    }
}

1 个答案:

答案 0 :(得分: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);
    }
}

这样做的好处是在获取引用时没有任何同步就是线程安全的。