当前位置: 首页 > 面试题库 >

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

施晗日
2023-03-14
问题内容

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

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

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

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


问题答案:

解决方案1:
找到一种解决方案来标识要插入钥匙的插槽。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软件包的另一种方法(如下)帮助我克服了这一点。

解决方案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实例不符合我的要求,我选择了redis cluster。我用三个节点组成集群,并将数据填充到集群中。当我使用JedisCluster从集群获取数据时,它比单个实例花费更多的时间。那么,将绝地与redis星系团连接起来的正确方式是什么呢。我如何利用连接池将绝地与redis集群连接起来?

  • 我已经使用jedis将redis集成到我的spring web应用程序中(redis支持AWS弹性缓存)。在单节点上,它可以很好地使用单绝地连接工厂进行读写。 我现在需要将它扩展到一个集群,以便写入主节点并从次节点读取。也就是说,如果一个下降,那么复制将由AWS自动发生,在这种情况下,我将连接的主机名将被更改。 如何读取进入图片的新节点? 我如何从spring容器(我指的是XML文件)连接到它?

  • 我在一个集群中有两个节点;我允许用户有节点特定的配置,如日志级别,本地缓存设置等;有时,管理这些设置变得非常困难,因为用户必须知道或记住应用在特定节点上的配置--在找到该特定节点之前移动一个又一个节点;是否有任何标准或已知的方法可以从单个地方管理这些节点?比如,从httpd服务器本身还是将一个节点作为主节点并记住其他节点?

  • 本文向大家介绍在Redis集群中使用pipeline批量插入的实现方法,包括了在Redis集群中使用pipeline批量插入的实现方法的使用技巧和注意事项,需要的朋友参考一下 由于项目中需要使用批量插入功能, 所以在网上查找到了Redis 批量插入可以使用pipeline来高效的插入, 示例代码如下: 但实际上遇到的问题是,项目上所用到的Redis是集群,初始化的时候使用的类是JedisClust

  • 详细说明请查阅插件的README nutz-integration-jedis Git@OSC镜像 jedis是redis的java客户端,请注意区别. 本插件在当前版本(1.r.60.r4), 已完成单机和集群操作的集成. 提供多种使用方式 aop -- 自动管理Jedis实例的开启和关闭,推荐使用 注入JedisPool -- JedisPool就是连接池本身,使用try-with-resou

  • 我试图使用Kubernetes,Jenkins和我的私有SVN存储库实现CI/CD管道。我计划使用Kubernetes集群,它有3台主机器和15台工作机器/节点。并使用Jenkins部署使用spring Boot开发的微服务。那么当我正在使用Jenkins进行部署时,我如何定义哪个微服务需要部署在kubernetes集群中的哪个节点?。我需要在Pod中指定吗?或者其他定义?