Jedis-高性能servlet-设置

2020年6月4日 58点热度 0条评论

我们正在Elastic Beanstalk上运行一个servlet,并与ElastiCache进行连接,并且运行良好,但是现在在高峰时段我们获得了很高的CPU负载(50%),并正在寻求对其进行优化。

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

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

我们遇到的一个问题是 Activity 连接的数量突然增加到8400,并且没有下降。似乎什么都没有影响,但仍然想知道它如何达到如此之高以及是否会影响性能。

所以我的问题是:

  • 是否应该使用另一个像生菜(https://github.com/mp911de/lettuce)这样看起来更好维护的库?
  • 还是应该使用连接池?我们每天都有数百万个请求,因此如果这会引起其他问题(例如池中的最大连接数),是否会害怕切换到连接池?
  • 还是我们还有其他需要调整的地方?
  • 解决方案如下:

    如果您想“只是”做一些Redis,Jedis是一个很小而不错的图书馆。它之所以迅速发展,是因为它只是在做自己的工作。 Jedis的可伸缩性受到线程/连接的限制,并且连接不是线程安全的。您可以使用连接池,我坚信,这将有助于解决您的问题。

    每次调用时,上面的代码都会与Redis连接/断开连接。汇集可能会有所帮助。 jedis使用commons-pool2对连接池来说是一个很好的实现,但是与其他框架相比要慢一些。

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

    您询问了莴苣:莴苣仅需要一个连接,因为莴苣连接是线程安全的(只要您不使用阻塞操作[BLPOP]或事务处理[EXEC / DISPATCH])。生菜比jedis慢一点,但提供:

  • 线程安全
  • 连接断开时自动重新连接和命令缓冲
  • 异步API
  • 使用Redis Standalone(或Redis主/从)时,lettuce不提供从属读取(尚未)。也没有针对ElastiCache的故障转移/服务发现(仅Redis Sentinel支持故障转移)。

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

    HTH,马克