java - Jedis - 高性能 servlet - 设置

标签 java redis amazon-elastic-beanstalk jedis amazon-elasticache

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

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

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

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

所以我的问题是:

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

最佳答案

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

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

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

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

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

在使用 Redis Standalone(或 Redis Master/Slave)时,lettuce 不提供从从属读取(还)。 ElastiCache 也没有故障转移/服务发现(只有 Redis Sentinel 支持故障转移)。

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

HTH,马克

关于java - Jedis - 高性能 servlet - 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32584066/

相关文章:

java - 错误 :Execution failed for task ':app:dexDebug' . com.android.ide.common.process.ProcessException

lua - 检查redis中特定值的键

amazon-web-services - 使用 AWS Elastic Beanstalk 将多个应用程序部署到单个 EC2 实例

amazon-web-services - AWS Elastic Beanstalk - Java 平台和 Tomcat 平台有什么区别?

java - 如何在 java 中生成所有可能的 64 位随机值?

java - 访问对象(动态选择的)子类的函数

java - 我的 SQLite 数据库中的上下文有问题,但我找不到它。 (使用 SQLiteAssetHelper)

ruby - 通过 Redis 手动启动 Sidekiq 作业

redis - 我们可以在 C# 中使用过期时间在 Redis 列表中添加值吗?

amazon-web-services - 使用 AWS CodeBuild 和 EB CLI 部署到 AWS Elastic Beanstalk