当前位置: 首页 > 知识库问答 >
问题:

从JedisPool到JedisCluster的转变

松鸣
2023-03-14

我的应用程序在AWS上使用ElastiCache进行缓存。我们目前的设置使用基本的Redis集群,没有分片或故障切换。我们现在需要转移到一个支持分片、故障切换等功能的集群Redis弹性缓存。在AWS上创建一个新集群很容易,但我们对如何修改java代码以从集群读写有点迷茫。

当前实现-初始化一个spool

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对象。或者我可以重复使用同一个对象,它将处理线程安全?那我什么时候才能关闭绝地武士团?在申请结束时?

共有2个答案

赵嘉赐
2023-03-14

用绝地群呼叫取代所有绝地呼叫是迁移的最佳方式。

但我想要管道支持,而绝地武士团目前缺乏这种支持。所以另一个想法是扩展JedisCluster以返回JedisPool

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

扩展类必须位于命名空间redis中。客户。绝地武士从插槽中获取连接。

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

你需要一个不同的杰迪斯为你想要操作的每个关键。这是有意义的——在集群模式下,每个键可以在不同的节点上。

钱志
2023-03-14

JedisCluster集群中的每个节点保存内部JedisPools。

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

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

那我什么时候才能关闭绝地武士团?在申请结束时?

是的。

 类似资料:
  • 我将获得一个AWS S3图像资源作为S3ObjectInputStream,并希望将其放入Vaadin图像HTML组件中。Vaadin图像只有两种初始化方式。第一个是通过一个表示文件路径的字符串,这意味着将S3映像写入磁盘,由于数据安全原因,我无法这样做,第二个是通过实现“AbstractStreamResource”的东西。现在的问题是,如何将S3ObjectInputStream转换为实现“A

  • 问题内容: 我试图扫描JedisCluster中存储的特定密钥。 在这里,我得到了空值。但是群集节点中存储了一个值。 但是,如果我尝试扫描每个Jedis池,我将得到结果。 为什么JedisCluster扫描方法无法提供正确的结果?我该如何解决这个问题? 注意:我可以用来检查密钥的存在。但是我需要使用扫描,因为我可以对Jedis和JedisCluster使用相同的界面。 问题答案: 第1部分: 在您

  • 问题内容: 我希望将标准JSON对象处理为一个对象,其中每行必须包含一个单独的,自包含的有效JSON对象。查看JSON行 : 我当前的解决方案是将JSON文件读取为文本文件,并从开头和结尾删除。因此,在每行上创建一个有效的JSON对象,而不是包含行的嵌套对象。 我想知道是否有更优雅的解决方案?我怀疑在文件上使用字符串操作可能会出错。 目的是在Spark上将文件读入RDD。查看相关问题-使用Apac

  • 我正在将一些使用Spring AOP的代码迁移到AspectJ方面(在编译时编织)。我正在寻找关于如何修改切入点以使它们在迁移后表现相同的反馈? 这让我很头疼,我想知道我是否可以更改切入点,使其仍然表现得好像它仍然是一个代理?(即在类型层次结构中的任何一点排除来自自身内部的调用,例如调用继承的函数)

  • 我一直在尝试编译,并玩了一圈的和数,但仍然不能弄清楚错误是什么。有什么想法吗? 标题:

  • (再说一遍,数据是字节数组) 但是,字节不匹配。我是不是漏掉了什么? (好吧,我当然是,否则它会起作用的,对吧?:S) -86,44,95,84,3,50,7,-119,-36,46,39,32,-120,7,10,-86,-101,110,-93,-72,-13,-93,-42,111,0,59,-85,-63,-15,-98,-17,-52 当转换为 170,44,95,84,3,50,7,1