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

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

大量连接

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

您可以执行下面的一组操作,避免在 Redis 服务器上遇到连接瓶颈:

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

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

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

通常,与典型的 Redis 命令相比,创建 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(m6g.2xlarge)ElastiCache for Redis 节点的 Amazon Elastic Compute Cloud(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); }