大量的連線 (Valkey 和 RedisOSS) - Amazon ElastiCache

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

大量的連線 (Valkey 和 RedisOSS)

無伺服器快取和個別 ElastiCache (RedisOSS) 節點支援最多 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.2xlargeEC2)( ElastiCache Redis ) 節點的 Amazon Elastic Compute Cloud (Amazon OSS) 執行個體的迴圈中對此程式碼進行了基準測試。我們將用戶端和伺服器放在相同可用區域內。整個操作的平均延遲為 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); }