我的应用程序在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?在申请结束时?
答案 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。这很有意义-在集群模式下,每个密钥可以位于不同的节点上。