使用Jedis如何写入Redis集群中的特定插槽/节点

我正在尝试提高将数据写入Redis集群的性能。我们正计划从redi-sentinel转换为集群模式以实现可伸缩性。

但是,与redis-sentinel相比,写操作的性能要差得多。我们在redis-sentinel中利用了管道,但是集群模式不支持管道。

因此,我正在考虑将所有进入同一节点的密钥归为一组,然后使用管道将批次发送到该特定节点。

因此,我想知道如何(在写入集群之前)将特定密钥写入哪个节点/插槽?

回答:

找到一种解决方案来标识要插入钥匙的插槽。JedisCluster提供了一些API。

int slotNum = JedisClusterCRC16.getSlot(key); -提供钥匙的插槽号。

Set<HostAndPort> redisClusterNode = new HashSet<HostAndPort>();

redisClusterNode.add(new HostAndPort(hostItem, port));

JedisSlotBasedConnectionHandler connHandler = new

JedisSlotBasedConnectionHandler(redisClusterNode, poolConfig, 60);

Jedis jedis = connHandler.getConnectionFromSlot(slotNum);

这为群集中的特定节点提供了jedis对象(内部来自Jedispool)。

现在,使用上述jedis对象,可以轻松地为特定节点(在集群中)流水线化所有命令

Pipeline pipeline = jedis.pipelined();

pipeline.multi();

for(Entry<String, Map<String, String>> kvf : kvfs.entrySet()) {

pipeline.hmset(kvf.getKey(), kvf.getValue());

}

pipeline.exec();

尽管使用JedisCluster(使用JedisCluster)提供了适当的节点,但密钥不能到达预期的性能,但我认为这是由于知道插槽编号和节点的过程所致。

每当我们尝试获取包含插槽号的实际节点(jedis)时,上述过程似乎都建立了到节点(群集中)的物理连接。因此,如果我们拥有数百万个键,这会阻碍性能。

因此,使用Lettuce软件包的另一种方法(如下)帮助我克服了这一点。


使用的Lettuce软件包支持在群集模式下发送批量命令。

     <groupId>biz.paluch.redis</groupId>

<artifactId>lettuce</artifactId>

<version>4.4.3.Final</version>

程式码片段:

RedisClusterClient client = RedisClusterClient.create(RedisURI.create("hostname", "port"));

StatefulRedisClusterConnection<String, String> connection = client.connect();

RedisAdvancedClusterAsyncCommands<String, String> commands = connection.async();

// Disabling auto-flushing

commands.setAutoFlushCommands(false);

List<RedisFuture<?>> futures = new ArrayList<>();

// kvf is of type Map<String, Map<String, String>>

for (Entry<> e : kvf.entrySet())

{

futures.add(commands.hmset( (String) e.getKey(), (Map<String, String>) e.getValue()));

}

// write all commands to the transport layer

commands.flushCommands();

// synchronization example: Wait until all futures complete

LettuceFutures.awaitAll(10, TimeUnit.SECONDS,

futures.toArray(new RedisFuture[futures.size()]));

参考:https : //github.com/lettuce-io/lettuce-core/wiki/Pipelining-and-

command-flushing


以上是 使用Jedis如何写入Redis集群中的特定插槽/节点 的全部内容, 来源链接: utcz.com/qa/430727.html

回到顶部