【问题标题】:Redis : Can I init jedis instance as a static final field?Redis:我可以将绝地实例初始化为静态最终字段吗?
【发布时间】:2014-02-03 18:31:43
【问题描述】:

我需要使用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 的好方法吗?

【问题讨论】:

    标签: java redis jedis


    【解决方案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;
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-10-06
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        • 2018-05-09
        • 1970-01-01
        • 2013-09-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多