大量连接 - 亚马逊 ElastiCache (Redis OSS)
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

大量连接

无服务器缓存和单个 ElastiCache (Redis OSS) 节点最多支持 65,000 个并发客户端连接。但为了优化性能,我们建议客户端应用程序不要一直在该级别的连接上运行。Redis OSS 是一个基于事件循环的单线程进程,其中按顺序处理传入的客户端请求。这意味着随着已连接客户端的增多,给定客户端的响应时间会变长。

您可以采取以下一组操作来避免在 Redis OSS 服务器上遇到连接瓶颈:

  • 从只读副本执行读取操作。这可以通过在禁用集群模式下使用 ElastiCache 读取器终端节点,或者在启用集群模式(包括无服务器缓存)的情况下使用副本进行读取。

  • 在多个主节点之间分配写入流量。您可以通过两种方式执行此操作。您可以将多分片 Redis OSS 集群与支持 Redis OSS 集群模式的客户端一起使用。您还可以在已禁用集群模式的情况下通过客户端分片对多个主节点进行写入。此过程在无服务器缓存中自动完成。

  • 如果您的客户端库中有连接池,请使用它。

通常,与典型的 Redis OSS 命令相比,创建 TCP 连接的计算成本很高。例如,在重复使用现有连接时,处理 SET/GET 请求的速度快一个数量级。使用大小有限的客户端连接池可减少连接管理的开销。它还将限制来自客户端应用程序的并发传入连接数。

以下 PHPRedis 代码示例说明为每个新用户请求创建一个新连接:

$redis = new Redis(); if ($redis->connect($HOST, $PORT) != TRUE) { //ERROR: connection failed return; } $redis->set($key, $value); unset($redis); $redis = NULL;

我们在连接到 Graviton2 (m ElastiCache 6g.2xlarge)(Redis OSS)节点的亚马逊弹性计算云 (Amazon EC2) 实例上循环对这段代码进行了基准测试。我们将客户端和服务器置于同一可用区中。整个操作的平均延迟为 2.82 毫秒。

在更新代码并使用持久连接和连接池时,整个操作的平均延迟为 0.21 毫秒:

$redis = new Redis(); if ($redis->pconnect($HOST, $PORT) != TRUE) { // ERROR: connection failed return; } $redis->set($key, $value); unset($redis); $redis = NULL;

所需的 redis.ini 配置:

  • redis.pconnect.pooling_enabled=1

  • redis.pconnect.connection_limit=10

以下代码是 Redis-py 连接池的示例:

conn = Redis(connection_pool=redis.BlockingConnectionPool(host=HOST, max_connections=10)) conn.set(key, value)

以下代码是 Lettuce 连接池的示例:

RedisClient client = RedisClient.create(RedisURI.create(HOST, PORT)); GenericObjectPool<StatefulRedisConnection> pool = ConnectionPoolSupport.createGenericObjectPool(() -> client.connect(), new GenericObjectPoolConfig()); pool.setMaxTotal(10); // Configure max connections to 10 try (StatefulRedisConnection connection = pool.borrowObject()) { RedisCommands syncCommands = connection.sync(); syncCommands.set(key, value); }