如何在Flask Redis缓存中设置连接超时时间

4

我想在我的Python代码中使用 Redis 缓存。以下代码可以正常运行并设置键。如果无法连接到 Redis 或端口未打开,我希望设置超时时间。

不幸的是,我找不到任何文档说明如何将超时时间传递给连接参数。

以下是我的代码:

from flask import Flask, render_template
from flask_caching import Cache

app = Flask(__name__, static_url_path='/static')

config = {
    "DEBUG": True,          
    "CACHE_TYPE": "redis",
    "CACHE_DEFAULT_TIMEOUT": 300,
    "CACHE_KEY_PREFIX": "inventory",
    "CACHE_REDIS_HOST": "localhost",
    "CACHE_REDIS_PORT": "6379",
    "CACHE_REDIS_URL": 'redis://localhost:6379'
}

cache = Cache(app, config=config)
socket_timeout = 5


@app.route('/')
@cache.memoize()
def dev():
  # some code
  return render_template("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.

提前感谢。

2个回答

2
这个问题相当古老,但我刚遇到了这个问题,并找到了解决方案。在此为后来的读者留下记录。
根据https://flask-caching.readthedocs.io/en/latest/index.html上的文档,CACHE_TYPE参数:
指定要使用的缓存对象类型。这是一个导入字符串,将被导入并实例化。假定导入对象是一个函数,它将返回一个符合缓存API的缓存对象。
因此,请按以下方式对其进行修改,以创建一个修改后的版本的他们在flask_caching.backends.cache中找到的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)

使用以下方式代替默认的redis

CACHE_TYPE = 'path.to.redis_with_timeout'

并且该库将使用这个新的Redis客户端,其中包含自定义的kwargs参数。希望能帮到你。


2
最新文档中可以看到,几乎所有类型的缓存后端都会传递一个名为CACHE_OPTIONS的配置作为关键字参数:

CACHE_OPTIONS中的条目将作为**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_OPTIONS必须以“sentinel_”为前缀;否则,选项将是错误的。这在Flask-Caching 1.9.0中会发生,请参见:https://github.com/sh4nks/flask-caching/blob/master/flask_caching/backends/rediscache.py#L259 - Roger Huang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接