本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
大量的連線 (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); }