我正在通过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;
}
}
最佳答案
我会说这是一个坏主意。我认为一般而言,单例并不是一个好主意,但是即使如此,这也不是一个好方法。您的代码不是线程安全的,似乎您要支持多个主机。
如果您确实不想将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);
}
}
这样的好处是线程安全,而在获取引用时不进行任何同步。