从JedisPool过渡到JedisCluster

时间:2018-12-18 09:52:13

标签: jedis amazon-elasticache

我的应用程序在AWS上使用ElastiCache进行缓存。我们当前的设置使用没有分片或故障转移的基本Redis群集。现在,我们需要转到启用了分片,故障转移等功能的集群Redis Elastic Cache。在AWS上创建新集群很容易,但是对于如何修改Java代码以从集群读取和写入数据,我们有些迷茫。

当前实施- 初始化JedisPool

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(100);
jedisPoolConfig.setMaxIdle(10);
jedisPoolConfig.setMaxWaitMillis(50);
jedisPoolConfig.setTestOnBorrow(true);

String host = "mycache.db8e1v.0001.usw2.cache.amazonaws.com";
int port = 6379;
int timeout = 50;

JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout)

每次需要执行操作时,都会从池中借用Jedis对象

Jedis jedis = JedisPool.getResource();

新的实现将是

JedisPoolConfig jedisPoolConfig = ...
HostAndPort hostAndPort = new HostAndPort(host, port);
jedisCluster = new JedisCluster(Collections.singleton(hostAndPort), jedisPoolConfig);

问题: 文档说JedisCluster将代替Jedis(而不是JedisPool)使用。这是否意味着我需要在每个线程中创建和销毁JedisCluster对象。还是可以重用同一对象,它将处理线程安全性?那我什么时候才完全关闭JedisCluster?在申请结束时?

2 个答案:

答案 0 :(得分:2)

JedisCluster为群集中的每个节点保存内部JedisPool

  

这是否意味着我需要在其中创建和销毁JedisCluster对象   每个线程。或者我可以重复使用相同的对象,它将处理   线程安全?

您可以重复使用同一对象。

  

那我什么时候才完全关闭JedisCluster?在末尾   申请吗?

是的

答案 1 :(得分:0)

用JedisCluster调用替换所有Jedis调用是迁移的最佳方法。

但是我想要JedisCluster当前缺乏的管道支持。因此,另一个想法是扩展JedisCluster以返回JedisPool> Jedis以获取特定密钥:

protected Jedis getJedis(String key) {
    int slot = JedisClusterCRC16.getSlot(key);
    return connectionHandler.getConnectionFromSlot(slot);
}

扩展类必须位于名称空间redis.clients.jedis中才能访问getConnectionFromSlot。

现在可以在Jedis上执行管道了。

您需要为每个要操作的键使用不同的Jedis。这很有意义-在集群模式下,每个密钥可以位于不同的节点上。