

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 大量的連線 (Valkey 和 Redis OSS)
<a name="BestPractices.Clients.Redis.Connections"></a>

無伺服器快取和個別 ElastiCache for 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 for Redis OSS 節點的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體的迴圈中對此程式碼進行了基準測試。 ElastiCache 我們將用戶端和伺服器放在相同可用區域內。整個操作的平均延遲為 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 連線集區](https://redis.readthedocs.io/en/stable/)的範例：

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

下列程式碼是 [Lettuce 連線集區](https://lettuce.io/core/release/reference/#_connection_pooling)的範例：

```
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);
}
```