【问题标题】:how to set connection timeout in flask redis cache如何在烧瓶 redis 缓存中设置连接超时
【发布时间】:2019-11-10 16:16:59
【问题描述】:

我正在尝试将 redis 缓存与我的 python 代码一起使用,下面的代码工作正常,并且它完美地设置了键。我想在它无法连接到 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.

提前致谢。

【问题讨论】:

    标签: python flask redis redis-cluster


    【解决方案1】:

    这个问题相当老了,但刚刚遇到了这个确切的问题,我找到了解决方案。留在这里留给未来的读者。

    根据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'
    

    而库将使用该库代替,并将自定义 kwargs 传递到底层 Redis 客户端。希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      latest document 开始,有一个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)
      

      【讨论】:

      猜你喜欢
      • 2013-01-24
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 2016-01-03
      • 1970-01-01
      相关资源
      最近更新 更多