flask cache:根据模式列出键?

时间:2016-04-19 04:17:07

标签: python caching flask redis flask-cache

我正在使用带有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?

2 个答案:

答案 0 :(得分:1)

烧瓶缓存看起来已过时。您可以切换到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_是烧瓶缓存中的默认CACHE_KEY_PREFIX。如果您为CACHE_KEY_PREFIX使用了其他值,请使用该值(而不是flask_cache_)作为搜索模式的前缀。

答案 1 :(得分:0)

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

相关问题