diff --git a/src/config.ts b/src/config.ts index 5a9fc4e..296f7ce 100644 --- a/src/config.ts +++ b/src/config.ts @@ -136,7 +136,8 @@ addDefaults(config, { }, disableOfflineQueue: true, expiryTime: 24 * 60 * 60, - getTimeout: 40 + getTimeout: 40, + maxConnections: 15000 }, redisRead: { enabled: false, diff --git a/src/types/config.model.ts b/src/types/config.model.ts index 95ac440..9888209 100644 --- a/src/types/config.model.ts +++ b/src/types/config.model.ts @@ -5,6 +5,7 @@ interface RedisConfig extends redis.RedisClientOptions { enabled: boolean; expiryTime: number; getTimeout: number; + maxConnections: number; } interface RedisReadOnlyConfig extends redis.RedisClientOptions { diff --git a/src/utils/redis.ts b/src/utils/redis.ts index 27b552c..49d7ed0 100644 --- a/src/utils/redis.ts +++ b/src/utils/redis.ts @@ -41,7 +41,13 @@ if (config.redis?.enabled) { const get = client.get.bind(client); const getRead = readClient?.get?.bind(readClient); exportClient.get = (key) => new Promise((resolve, reject) => { + if (activeRequests > config.redis.maxConnections) { + reject("Too many active requests"); + return; + } + activeRequests++; + const timeout = config.redis.getTimeout ? setTimeout(() => reject(), config.redis.getTimeout) : null; const chosenGet = pickChoice(get, getRead); chosenGet(key).then((reply) => {