1

我需要使用Redis作为Java中的数据源,所以我决定使用代码:

public class RedisService {
    private static final Jedis jedis = new Jedis("host",6400);;

    public static Device getDevice(String key) {
        // Do something use redis.
        return null;
    }

}

我以为服务器会自动初始化 Jedis(Redis API for Java),这是使用 Jedis 的好方法吗?

4

2 回答 2

1

正如 Santosh Joshi 试图解释的那样:最好使用 JedisFactory。由于网络、过载等原因,您的单例 Jedis 可能会“死亡”……您必须重新启动应用程序才能获得与 Redis 的新连接。

为了解决这个问题,您可以定义一个 Jedis Pool,如果您不想使用 Spring(Santosh 的解决方案所基于的 Spring),您可以使用 Jedis 提供的 JedisPool 类。然后,您可以将其定义为单例(例如静态 final 或通过 Spring)并从中获取 Jedis 实例。

由于它是一个池,因此您一次可以获得多个与 Redis 的连接(您可以对其进行配置),并且它支持处理断开的连接:当一个连接死亡时,它会创建新的 Jedis。

于 2014-02-03T10:31:43.277 回答
1

看看我们是如何使用 Jedis 的:

  1. org.springframework.data.redis.connection.jedis.JedisConnectionFactory通过传递主机和端口信息创建一个单例实例

  2. org.springframework.data.redis.core.RedisTemplate通过将连接工厂传递给它来创建单例实例

  3. 在你的服务中使用上面创建的 redisTemplate,使用 Redistemplate 的好处是你可以使用它对 redis 提供的所有数据结构执行操作( list, set, hashes )

仅供您参考,这里是执行相同操作的 spring 代码,如果您使用的是 spring,则可以使用,否则您可以使用 java 代码创建相同的代码

<!-- Create Factory -->
<bean id="jedisFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
   <property name="hostName" value="localhost" />
   <property name="port" value="6370" />
   <property name="timeout" value="5000" />
</bean> 

<!-- Create Redis Template -->
<bean id="redisRemplate" class="org.springframework.data.redis.core.RedisTemplate" >
    <property name ="connectionFactory" ref="jedisFactory" />
</bean>

<!-- Your Service class -->
<bean id="serviceClass" class="RedisService" >
    <property name ="redisTemplate" ref="redisRemplate" />
</bean>

public class RedisService 
{
    private final RedisTemplate redisTemplate = /* get from  store or  inject using spring */;

    public static Device getDevice(String key) {
        // Do something use Redis.
        return null;
    }
}
于 2013-12-14T07:56:23.160 回答