大量连接(Valkey 和 Redis OSS)
无服务器缓存和单个 ElastiCache(Redis OSS)节点支持多达 65,000 个并发客户端连接。但为了优化性能,我们建议客户端应用程序不要一直在该级别的连接上运行。Valkey 和 Redis OSS 都是基于事件循环的单线程进程,按顺序处理传入客户端请求。这意味着随着已连接客户端的增多,给定客户端的响应时间会变长。
您可以执行下面的一组操作,避免在 Valkey 或 Redis OSS 服务器上遇到连接瓶颈:
从只读副本执行读取操作。这可以通过使用 ElastiCache 读取器端点(在已禁用集群模式的情况下)或使用只读副本(在已启用集群模式的情况下,包括无服务器缓存)来实现。
在多个主节点之间分配写入流量。您可以通过两种方式执行此操作。您可以将多分片 Valkey 或 Redis OSS 集群与支持集群模式的客户端结合使用。您还可以在已禁用集群模式的情况下通过客户端分片对多个主节点进行写入。此过程在无服务器缓存中自动完成。
如果您的客户端库中有连接池,请使用它。
通常,与典型的 Valkey 或 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(m6g.2xlarge)ElastiCache(Redis OSS)节点的 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); }