Jedis - 高性能 servlet - 设置

Jedis - high performing servlet - settings

我们是 运行 Elastic Beanstalk 上的一个 servlet,我们连接到 ElastiCache,它 运行 相当好,但现在我们在高峰期的负载 CPU 很高 (50%)并正在研究优化它。

目前我们是这样使用Jedis的:

try (Jedis jedis = new Jedis(Global.CLUSTER_ENDPOINT, 6379, 10000);) {              
    jedis.hset(f.dayOfFile, "content", f.xmlFile);
}

我们遇到的一个问题是活动连接数突然上升到 8400 并且没有下降。似乎没有影响任何东西,但仍然想知道它是如何达到那么高的,是否会影响性能。

所以我的问题是:

  1. 我们是否应该使用另一个看起来维护得更好的库,例如 lettuce (https://github.com/mp911de/lettuce)?
  2. 或者我们应该使用连接池吗?我们每天有数百万个请求,所以有点害怕切换到连接池,如果这会引入其他问题,例如池中的最大连接数?
  3. 或者还有什么我们应该调整的吗?

如果您想 "just" 做一些 Redis,Jedis 是一个小巧而不错的库。它非常快,因为它只做它的工作。 Jedis 的可扩展性受到 threads/connections 的限制,并且连接不是线程安全的。您可以使用连接池,我坚信这将有助于解决您的问题。

上面的代码connects/disconnects from/to Redis每次都会调用。汇集可能会有所帮助。 jedis 使用 commons-pool2,这是一个非常好的连接池实现,但与其他框架相比速度较慢。

你可以自己实现连接池,改善连接数高的问题。

您询问了 lettuce:对于 lettuce,您只需要一个连接,因为 lettuce 连接是线程安全的(只要您不使用阻塞操作 [BLPOP] 或事务 [EXEC /DISPATCH])。 Lettuce 比 jedis 稍慢,但提供:

  • 线程安全
  • 连接断开时自动重新连接和命令缓冲
  • 异步API

lettuce 在使用 Redis Standalone(或 Redis Master/Slave)时(还)不提供从奴隶读取数据。也没有 failover/service ElastiCache 发现(仅 Redis Sentinel 支持故障转移)。

一个缺点可能是 lettuce 的命令模式,因为 lettuce 会为您发出的每个命令创建一个命令。根据使用情况,命令会占用很大一部分内存。然而,这取决于您的观点。

HTH,马克

尝试Redisson它支持 AWS Elasticache 服务并提供连接池和最方便的 Java api 到 Redis。