mirror of
https://github.com/langgenius/dify.git
synced 2026-09-08 11:04:27 +08:00
feat: redis connection support max connections (#32935)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
b68ee600c1
commit
b584434e28
@ -42,6 +42,8 @@ REFRESH_TOKEN_EXPIRE_DAYS=30
|
|||||||
# redis configuration
|
# redis configuration
|
||||||
REDIS_HOST=localhost
|
REDIS_HOST=localhost
|
||||||
REDIS_PORT=6379
|
REDIS_PORT=6379
|
||||||
|
# Optional: limit total connections in connection pool (unset for default)
|
||||||
|
# REDIS_MAX_CONNECTIONS=200
|
||||||
REDIS_USERNAME=
|
REDIS_USERNAME=
|
||||||
REDIS_PASSWORD=difyai123456
|
REDIS_PASSWORD=difyai123456
|
||||||
REDIS_USE_SSL=false
|
REDIS_USE_SSL=false
|
||||||
|
|||||||
5
api/configs/middleware/cache/redis_config.py
vendored
5
api/configs/middleware/cache/redis_config.py
vendored
@ -111,3 +111,8 @@ class RedisConfig(BaseSettings):
|
|||||||
description="Enable client side cache in redis",
|
description="Enable client side cache in redis",
|
||||||
default=False,
|
default=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
REDIS_MAX_CONNECTIONS: PositiveInt | None = Field(
|
||||||
|
description="Maximum connections in the Redis connection pool (unset for library default)",
|
||||||
|
default=None,
|
||||||
|
)
|
||||||
|
|||||||
@ -181,13 +181,18 @@ def _create_sentinel_client(redis_params: dict[str, Any]) -> Union[redis.Redis,
|
|||||||
|
|
||||||
sentinel_hosts = [(node.split(":")[0], int(node.split(":")[1])) for node in dify_config.REDIS_SENTINELS.split(",")]
|
sentinel_hosts = [(node.split(":")[0], int(node.split(":")[1])) for node in dify_config.REDIS_SENTINELS.split(",")]
|
||||||
|
|
||||||
|
sentinel_kwargs = {
|
||||||
|
"socket_timeout": dify_config.REDIS_SENTINEL_SOCKET_TIMEOUT,
|
||||||
|
"username": dify_config.REDIS_SENTINEL_USERNAME,
|
||||||
|
"password": dify_config.REDIS_SENTINEL_PASSWORD,
|
||||||
|
}
|
||||||
|
|
||||||
|
if dify_config.REDIS_MAX_CONNECTIONS:
|
||||||
|
sentinel_kwargs["max_connections"] = dify_config.REDIS_MAX_CONNECTIONS
|
||||||
|
|
||||||
sentinel = Sentinel(
|
sentinel = Sentinel(
|
||||||
sentinel_hosts,
|
sentinel_hosts,
|
||||||
sentinel_kwargs={
|
sentinel_kwargs=sentinel_kwargs,
|
||||||
"socket_timeout": dify_config.REDIS_SENTINEL_SOCKET_TIMEOUT,
|
|
||||||
"username": dify_config.REDIS_SENTINEL_USERNAME,
|
|
||||||
"password": dify_config.REDIS_SENTINEL_PASSWORD,
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
|
|
||||||
master: redis.Redis = sentinel.master_for(dify_config.REDIS_SENTINEL_SERVICE_NAME, **redis_params)
|
master: redis.Redis = sentinel.master_for(dify_config.REDIS_SENTINEL_SERVICE_NAME, **redis_params)
|
||||||
@ -204,12 +209,15 @@ def _create_cluster_client() -> Union[redis.Redis, RedisCluster]:
|
|||||||
for node in dify_config.REDIS_CLUSTERS.split(",")
|
for node in dify_config.REDIS_CLUSTERS.split(",")
|
||||||
]
|
]
|
||||||
|
|
||||||
cluster: RedisCluster = RedisCluster(
|
cluster_kwargs: dict[str, Any] = {
|
||||||
startup_nodes=nodes,
|
"startup_nodes": nodes,
|
||||||
password=dify_config.REDIS_CLUSTERS_PASSWORD,
|
"password": dify_config.REDIS_CLUSTERS_PASSWORD,
|
||||||
protocol=dify_config.REDIS_SERIALIZATION_PROTOCOL,
|
"protocol": dify_config.REDIS_SERIALIZATION_PROTOCOL,
|
||||||
cache_config=_get_cache_configuration(),
|
"cache_config": _get_cache_configuration(),
|
||||||
)
|
}
|
||||||
|
if dify_config.REDIS_MAX_CONNECTIONS:
|
||||||
|
cluster_kwargs["max_connections"] = dify_config.REDIS_MAX_CONNECTIONS
|
||||||
|
cluster: RedisCluster = RedisCluster(**cluster_kwargs)
|
||||||
return cluster
|
return cluster
|
||||||
|
|
||||||
|
|
||||||
@ -225,6 +233,9 @@ def _create_standalone_client(redis_params: dict[str, Any]) -> Union[redis.Redis
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if dify_config.REDIS_MAX_CONNECTIONS:
|
||||||
|
redis_params["max_connections"] = dify_config.REDIS_MAX_CONNECTIONS
|
||||||
|
|
||||||
if ssl_kwargs:
|
if ssl_kwargs:
|
||||||
redis_params.update(ssl_kwargs)
|
redis_params.update(ssl_kwargs)
|
||||||
|
|
||||||
@ -234,9 +245,17 @@ def _create_standalone_client(redis_params: dict[str, Any]) -> Union[redis.Redis
|
|||||||
|
|
||||||
|
|
||||||
def _create_pubsub_client(pubsub_url: str, use_clusters: bool) -> redis.Redis | RedisCluster:
|
def _create_pubsub_client(pubsub_url: str, use_clusters: bool) -> redis.Redis | RedisCluster:
|
||||||
|
max_conns = dify_config.REDIS_MAX_CONNECTIONS
|
||||||
if use_clusters:
|
if use_clusters:
|
||||||
return RedisCluster.from_url(pubsub_url)
|
if max_conns:
|
||||||
return redis.Redis.from_url(pubsub_url)
|
return RedisCluster.from_url(pubsub_url, max_connections=max_conns)
|
||||||
|
else:
|
||||||
|
return RedisCluster.from_url(pubsub_url)
|
||||||
|
|
||||||
|
if max_conns:
|
||||||
|
return redis.Redis.from_url(pubsub_url, max_connections=max_conns)
|
||||||
|
else:
|
||||||
|
return redis.Redis.from_url(pubsub_url)
|
||||||
|
|
||||||
|
|
||||||
def init_app(app: DifyApp):
|
def init_app(app: DifyApp):
|
||||||
|
|||||||
@ -349,6 +349,9 @@ REDIS_SSL_CERTFILE=
|
|||||||
REDIS_SSL_KEYFILE=
|
REDIS_SSL_KEYFILE=
|
||||||
# Path to client private key file for SSL authentication
|
# Path to client private key file for SSL authentication
|
||||||
REDIS_DB=0
|
REDIS_DB=0
|
||||||
|
# Optional: limit total Redis connections used by API/Worker (unset for default)
|
||||||
|
# Align with API's REDIS_MAX_CONNECTIONS in configs
|
||||||
|
REDIS_MAX_CONNECTIONS=
|
||||||
|
|
||||||
# Whether to use Redis Sentinel mode.
|
# Whether to use Redis Sentinel mode.
|
||||||
# If set to true, the application will automatically discover and connect to the master node through Sentinel.
|
# If set to true, the application will automatically discover and connect to the master node through Sentinel.
|
||||||
|
|||||||
@ -90,6 +90,7 @@ x-shared-env: &shared-api-worker-env
|
|||||||
REDIS_SSL_CERTFILE: ${REDIS_SSL_CERTFILE:-}
|
REDIS_SSL_CERTFILE: ${REDIS_SSL_CERTFILE:-}
|
||||||
REDIS_SSL_KEYFILE: ${REDIS_SSL_KEYFILE:-}
|
REDIS_SSL_KEYFILE: ${REDIS_SSL_KEYFILE:-}
|
||||||
REDIS_DB: ${REDIS_DB:-0}
|
REDIS_DB: ${REDIS_DB:-0}
|
||||||
|
REDIS_MAX_CONNECTIONS: ${REDIS_MAX_CONNECTIONS:-}
|
||||||
REDIS_USE_SENTINEL: ${REDIS_USE_SENTINEL:-false}
|
REDIS_USE_SENTINEL: ${REDIS_USE_SENTINEL:-false}
|
||||||
REDIS_SENTINELS: ${REDIS_SENTINELS:-}
|
REDIS_SENTINELS: ${REDIS_SENTINELS:-}
|
||||||
REDIS_SENTINEL_SERVICE_NAME: ${REDIS_SENTINEL_SERVICE_NAME:-}
|
REDIS_SENTINEL_SERVICE_NAME: ${REDIS_SENTINEL_SERVICE_NAME:-}
|
||||||
|
|||||||
@ -91,6 +91,9 @@ MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT=2
|
|||||||
# -----------------------------
|
# -----------------------------
|
||||||
REDIS_HOST_VOLUME=./volumes/redis/data
|
REDIS_HOST_VOLUME=./volumes/redis/data
|
||||||
REDIS_PASSWORD=difyai123456
|
REDIS_PASSWORD=difyai123456
|
||||||
|
# Optional: limit total Redis connections used by API/Worker (unset for default)
|
||||||
|
# Align with API's REDIS_MAX_CONNECTIONS in configs
|
||||||
|
REDIS_MAX_CONNECTIONS=
|
||||||
|
|
||||||
# ------------------------------
|
# ------------------------------
|
||||||
# Environment Variables for sandbox Service
|
# Environment Variables for sandbox Service
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user