【问题标题】:flask cache: list keys based on a pattern?烧瓶缓存:基于模式列出键?
【发布时间】:2016-08-11 01:05:59
【问题描述】:

我正在使用带有 Redis 的 Flask Cache 插件作为后端来缓存我的 API 响应。假设我有 API 来获取用户并创建这样的用户:

/api/users?page=1  GET
/api/users         POST

GET 结果将以完整的 URL 作为键进行缓存。创建新用户时,我想删除所有以 /api/users 开头的键 - 目前我正在做 cache.clear() 但似乎几乎没有必要。

但是,我似乎找不到获取密钥列表的 API。对于redis-py,有一个用于此目的的keys(*pattern) API。 Flask Cache 有类似的 API 吗?

【问题讨论】:

    标签: python caching flask redis flask-cache


    【解决方案1】:

    Flask-Cache 看起来已经过时了。您可以切换到 Flask-Caching,它是 Flask-Cache 的维护分支。

    按模式删除 Redis 键

    您有两种选择:

    1. 使用redis 包单独连接到Redis。使用包提供的核心命令根据模式搜索键并删除它们。
    2. 使用 Flask-Cache / Flask-Caching 的受保护方法来访问底层 Redis 对象,并使用该对象上的核心命令根据模式搜索键并删除它们。

    选项 1:单独连接到 Redis

    # python utility for redis
    import redis
    
    r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB, password=REDIS_PASSWORD)
    
    def delete_pattern(pattern: str) -> int:
        """Remove all keys matching pattern.
        """
        count = 0
        for key in r.scan_iter(pattern):
            r.delete(key)
            count += 1
        return count
    
    # pass pattern to delete
    CACHE_URL_PAT = "flask_cache*auth*"
    delete_pattern(CACHE_URL_PAT)
    
    

    选项 2:使用受保护的方法来访问底层 Redis 连接对象

    ⚠️ 尽管这可以正常工作,但这些都是未记录的方法。我通过 GitHub 上的 source code 创建了这个函数。 仅针对 CACHE_TYPE = 'redis' 进行测试

    # initialised cache object stored in extensions file
    from app.extensions import cache
    
    def delete_pattern(pattern):
        status = False
        binary_keys = cache.cache._read_clients.keys(pattern)
        keys = [k.decode("utf-8", errors="ignore") for k in binary_keys if k]
        if keys:
            status = cache.cache._write_client.delete(*keys)
        return status
    
    # pass pattern to delete
    CACHE_URL_PAT = "flask_cache*auth*"
    delete_pattern(CACHE_URL_PAT)
    
    

    注意:flask_cache_ 是 Fl​​ask 缓存中的默认 CACHE_KEY_PREFIX。如果您为 CACHE_KEY_PREFIX 使用了其他值,请使用该值(而不是 flask_cache_)作为搜索模式的前缀。

    【讨论】:

      【解决方案2】:

      Flask 缓存插件不提供对原始 redis 命令的任何访问点。 您可以使用 redis-py 连接到相同的 redis 实例和数据库,以按模式删除键。

      【讨论】:

        猜你喜欢
        • 2016-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-07
        • 1970-01-01
        • 2020-05-25
        • 2018-04-02
        • 1970-01-01
        相关资源
        最近更新 更多