Python 如何在flask redis缓存中设置连接超时

Python 如何在flask redis缓存中设置连接超时,python,flask,redis,redis-cluster,Python,Flask,Redis,Redis Cluster,我试图在python代码中使用redis缓存,下面的代码运行良好,并且它完美地设置了键。我想在无法连接到redis或端口未打开时设置超时。 不幸的是,我找不到任何关于如何将超时传递给连接参数的文档 下面是我的代码 从烧瓶导入烧瓶,渲染\u模板 从缓存导入缓存 app=Flask(\uuuuu name\uuuuuu,static\uurl\u path='/static') 配置={ “调试”:正确, “缓存类型”:“redis”, “缓存默认超时”:300, “缓存密钥前缀”:“库存”, “C

我试图在python代码中使用redis缓存,下面的代码运行良好,并且它完美地设置了键。我想在无法连接到redis或端口未打开时设置超时。 不幸的是,我找不到任何关于如何将超时传递给连接参数的文档

下面是我的代码

从烧瓶导入烧瓶,渲染\u模板
从缓存导入缓存
app=Flask(\uuuuu name\uuuuuu,static\uurl\u path='/static')
配置={
“调试”:正确,
“缓存类型”:“redis”,
“缓存默认超时”:300,
“缓存密钥前缀”:“库存”,
“CACHE\u REDIS\u HOST”:“localhost”,
“缓存REDIS_端口”:“6379”,
“缓存\u REDIS\u URL”:redis://localhost:6379'
}
cache=cache(app,config=config)
套接字超时=5
@应用程序路径(“/”)
@cache.memoize()
def dev():
#一些代码
返回render_模板(“index.html”,data=json_data,columns=columns)
当无法连接时,它会等待很长时间并抛出以下错误:

Traceback (most recent call last):
  File "/Users/amjad/.virtualenvs/inventory/lib/python3.7/site-packages/flask_caching/__init__.py", line 771, in decorated_function
    f, *args, **kwargs
  File "/Users/amjad/.virtualenvs/inventory/lib/python3.7/site-packages/flask_caching/__init__.py", line 565, in make_cache_key
    f, args=args, timeout=_timeout, forced_update=forced_update
  File "/Users/amjad/.virtualenvs/inventory/lib/python3.7/site-packages/flask_caching/__init__.py", line 524, in _memoize_version
    version_data_list = list(self.cache.get_many(*fetch_keys))
  File "/Users/amjad/.virtualenvs/inventory/lib/python3.7/site-packages/flask_caching/backends/rediscache.py", line 101, in get_many
    return [self.load_object(x) for x in self._read_clients.mget(keys)]
  File "/Users/amjad/.virtualenvs/inventory/lib/python3.7/site-packages/redis/client.py", line 1329, in mget
    return self.execute_command('MGET', *args, **options)
  File "/Users/amjad/.virtualenvs/inventory/lib/python3.7/site-packages/redis/client.py", line 772, in execute_command
    connection = pool.get_connection(command_name, **options)
  File "/Users/amjad/.virtualenvs/inventory/lib/python3.7/site-packages/redis/connection.py", line 994, in get_connection
    connection.connect()
  File "/Users/amjad/.virtualenvs/inventory/lib/python3.7/site-packages/redis/connection.py", line 497, in connect
    raise ConnectionError(self._error_message(e))
redis.exceptions.ConnectionError: Error 60 connecting to localhost:6379. Operation timed out.

提前谢谢。

这个问题很老了,但刚刚遇到了这个问题,我找到了解决办法。留给后人,留给未来的读者

根据处的文档,
缓存类型
参数:

指定要使用的缓存对象的类型。这是一个将被导入和实例化的导入字符串。假设导入对象是一个函数,它将返回一个遵循缓存API的缓存对象

因此,对其
redis
函数进行修改,可以在
flask\u caching.backends.cache
中找到,如下所示:

def redis_with_timeout(app, config, args, kwargs):

    try:
        from redis import from_url as redis_from_url
    except ImportError:
        raise RuntimeError("no redis module found")

    # [... extra lines skipped for brevity ...]

    # kwargs set here are passed through to the underlying Redis client
    kwargs["socket_connect_timeout"] = 0.5
    kwargs["socket_timeout"] = 0.5

    return RedisCache(*args, **kwargs)
CACHE_TYPE = 'path.to.redis_with_timeout'
并使用它而不是默认的redis,如下所示:

def redis_with_timeout(app, config, args, kwargs):

    try:
        from redis import from_url as redis_from_url
    except ImportError:
        raise RuntimeError("no redis module found")

    # [... extra lines skipped for brevity ...]

    # kwargs set here are passed through to the underlying Redis client
    kwargs["socket_connect_timeout"] = 0.5
    kwargs["socket_timeout"] = 0.5

    return RedisCache(*args, **kwargs)
CACHE_TYPE = 'path.to.redis_with_timeout'
该库将使用该库,并将自定义kwargs传递到底层Redis客户端。希望有帮助。

从中,有一个
CACHE\u选项
config作为关键字参数传递给几乎所有类型的缓存后端:

缓存_选项中的条目作为**kwargs传递给redis客户端

我们只需传递以下附加设置:

from flask import Flask
from flask_caching import Cache

app = Flask(__name__)

config = {
    "CACHE_TYPE": "redis",
    ...
    "CACHE_REDIS_HOST": "localhost",
    "CACHE_REDIS_PORT": "6379",
    "CACHE_REDIS_URL": 'redis://localhost:6379',
    "CACHE_OPTIONS": {
        "socket_connect_timeout": 5,    # connection timeout in seconds
        "socket_timeout": 5,            # send/recv timeout in seconds
    }
}

cache = Cache(app, config=config)

请注意:如果您使用的是RedisSentinelCache,
CACHE\u选项
必须以“sentinel\u”作为前缀;否则,选项将出错,这发生在Flask Caching 1.9.0中,请参阅: