【问题标题】:Pipeline design question when using lettuce for RedisRedis使用lettuce时的流水线设计问题
【发布时间】:2023-01-22 10:58:13
【问题描述】:

我正在使用生菜管道,我有一个设计问题。当尝试使用下面的“sendBlock”方法向 redis 发送命令块时,我正在考虑 2 个选项:

(1) 拥有一个已经在类中建立的连接实例,并重用它:

private void sendBlock()
{   
   this.conn.setAutoFlushCommands(false);
   (...)
   this.conn.flushCommands();
}

(2) 每次发送命令块时,都会从 redis 获取连接,执行操作并关闭它。

private void sendBlock()
{
   StatefulRedisModulesConnection<String, String> conn = RedisClusterImpl.connect();
   conn.setAutoFlushCommands(false);
   (...)
   conn.flushCommands();
   conn.close();
}

由于已建立的连接似乎在生菜的所有线程之间共享,我不确定第 1 点是否正确。如果没有,我必须转到第 2 点。在这种情况下,我不知道从 Redis 获取连接的成本是多少,所以我想知道我是否需要使用池(生菜中不推荐的东西文档)。在我们的用例中,“sendBlock”方法可以同时调用数百次,因此它被许多不同的线程密集使用。

任何帮助将非常感激。

琼。

【问题讨论】:

    标签: redis lettuce


    【解决方案1】:

    Lettuce 连接是线程安全的,如果您不使用 Redis 阻塞命令(例如 BLPOP)和事务,则可以共享。

    这些应该在单独的连接上执行,因为事务将应用于整个连接,并且阻塞操作将阻塞连接直到它们完成。

    您是否应该共享手动刷新连接仅取决于您在两次刷新之间执行的操作数。前任。如果每个块是 10k 个命令,并且你有 10 个线程,你可以排队 100k 一次发送到你期望的 10k。这是否重要取决于您的申请,您应该检查您的个案的表现。

    如果每个块没有发送很多命令,您甚至可能不需要手动刷新,因为启用了自动刷新的 Lettuce 管道(参见 answer)。

    【讨论】:

      猜你喜欢
      • 2019-01-22
      • 2014-04-04
      • 1970-01-01
      • 2018-02-09
      • 2020-01-21
      • 2017-03-24
      • 2011-08-17
      • 2020-11-16
      • 2015-03-03
      相关资源
      最近更新 更多