【问题标题】:Redis connection pooling with JedisPool becoming too verboseRedis 连接池与 JedisPool 变得过于冗长
【发布时间】:2017-06-01 12:42:39
【问题描述】:

这是我的JedisFactory

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

class JedisFactory {
    private static JedisPool jedisPool;
    private static JedisFactory instance;

    public JedisFactory() {
        jedisPool = new JedisPool(getPoolConfig(), "localhost");
    }

    private JedisPoolConfig getPoolConfig() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        //poolConfig.setTestOnBorrow(true);
        //poolConfig.setTestOnReturn(true);
        poolConfig.setMaxIdle(2);
// Tests whether connections are dead during idle periods
        //poolConfig.setTestWhileIdle(true);
        poolConfig.setMaxTotal(2);
        //poolConfig.setMaxWaitMillis(120000);
        return poolConfig;
    }

    public JedisPool getJedisPool() {
        System.out.println("get pool");
        return jedisPool;
    }

    public static JedisFactory getInstance() {
        if (instance == null) {
            instance = new JedisFactory();
        }
        return instance;
    }
}

这是用法:

public static void del(String key) {
        Jedis jedis = JedisFactory.getInstance().getJedisPool().getResource();
        try {
            jedis.del(key);
        } finally {
            JedisFactory.getInstance().getJedisPool().returnResource(jedis);
        }
    }


    public static String ping() {
        Jedis jedis = JedisFactory.getInstance().getJedisPool().getResource();
        try {
            return jedis.ping();
        } finally {
            JedisFactory.getInstance().getJedisPool().returnResource(jedis);
        }
    }
    public static void clear() {
        Jedis jedis = JedisFactory.getInstance().getJedisPool().getResource();
        try {
            jedis.flushAll();
        } finally {
            JedisFactory.getInstance().getJedisPool().returnResource(jedis);
        }
    }

因此,对于每个操作,我都必须输入大量样板代码。如何避免?

【问题讨论】:

    标签: java redis connection-pooling jedis


    【解决方案1】:
    1. 您的 JedisFactory.getInstance() 工厂方法不是线程安全的。您可以动态拥有多个 JedisFactory 实例。

    2. 如果你使用 JDK 7 和最近的 Jedis 版本,你可以使用 try-with-resource。

      try (Jedis jedis = JedisFactory.getInstance().getJedisPool().getResource()) { jedis.flushAll(); }

    上面的代码可以工作。

    1. 由于 JedisPool 是线程安全的,您只需初始化 JedisPool 并传递到任何地方。如果你想继续使用 JedisFactory,你可以通过添加像 JedisFactory.getResource() 这样的 util 方法来最小化你的代码,让 getResource() 为调用者做所有的工作。由于您创建了 JedisFactory,因此无需向公众公开内部 JedisPool 字段。

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多