gpt4 book ai didi

redis - 使用jedis如何写入redis集群中的特定槽/节点

转载 作者:IT王子 更新时间:2023-10-29 06:05:02 25 4
gpt4 key购买 nike

我正在尝试提高将数据写入 redis 集群的性能。我们计划从 redi-sentinel 转移到集群模式以实现可扩展性。

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

因此,我想将所有转到同一节点的键分组,然后使用管道将批处理发送到该特定节点。

所以,我想知道如何知道/计算(在写入集群之前)特定 key 将写入到哪个节点/插槽?

最佳答案

解决方案 1:
找到了一个解决方案来识别 key 将进入的插槽。 JedisCluster 有一些 API 可以获取它。

int slotNum = JedisClusterCRC16.getSlot(key);- 提供 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)提供了键转到的适当节点,但这并没有为我提供预期的性能,我认为这是由于了解槽号和节点(槽的)所涉及的过程。
每次我们尝试获取包含槽号的实际节点(jedis)时,上述过程似乎都建立了到节点(在集群中)的物理连接。因此,如果我们有数百万个 key ,这会阻碍性能。
所以,另一种使用生菜包的方法(如下)帮助我克服了这个问题。


解决方案 2:
使用了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


关于redis - 使用jedis如何写入redis集群中的特定槽/节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49179753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com