如何有效使用JedisCluster

时间:2019-05-17 06:38:29

标签: redis

我是Redis的新手,我正在使用Redis Java Client与Redis集群一起使用。

我有以下代码:

public class HelloRedisCluster {
    public static void main(String[] args) {
        Set<HostAndPort> nodes = new HashSet<HostAndPort>();
        nodes.add(new HostAndPort("127.0.0.1", 6001));
        nodes.add(new HostAndPort("127.0.0.1", 6002));
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(10000);
        config.setMaxIdle(500);

        JedisCluster cluster = new JedisCluster(nodes);
        cluster.set("abc", "123");
        System.out.println(cluster.get("abc"));
        cluster.close();
    }
}

在上面的代码中,它只是打开集群,使用Redis进行设置/获取,然后关闭集群。

如果代码作为服务运行(例如在Servlet中),则它将频繁打开和关闭集群,这将导致性能下降。

我会问如何有效使用JedisCluster?

谢谢!

1 个答案:

答案 0 :(得分:0)

我已经弄清楚JedisCluster的工作方式。在内部,它已经使用了Jedis Pool。

JedisCluster提供的操作遵循相同的模式,例如set

1. Borrow a Jedis object from Jedis Pool
2. Call Jedis#set method
3. Release the Jedis object back to the pool.

因此,我们可以将JedisCluster实例保存在Singleton对象中,然后在JVM退出时关闭JedisCluster对象,使用以下代码:

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.util.HashSet;
import java.util.Set;

public class JedisClusterUtil {
    private static JedisCluster cluster;

    static {
        Set<HostAndPort> nodes = new HashSet<HostAndPort>();
        nodes.add(new HostAndPort("127.0.0.1", 6001));
        nodes.add(new HostAndPort("127.0.0.1", 6002));
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(10000);
        config.setMaxIdle(500);

        cluster = new JedisCluster(nodes, config);

        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                if (cluster != null) {
                    cluster.close();
                }
            }
        });
    }

    public static JedisCluster getCluster() {
        return cluster;
    }
}