6

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

4

2 回答 2

2

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 上的源代码来创建这个函数。仅针对 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-Caching 中flask_cache_是默认的。CACHE_KEY_PREFIX如果您为 使用了其他值CACHE_KEY_PREFIX,请使用该值(而不是flask_cache_)作为搜索模式的前缀。

于 2020-08-18T20:21:12.200 回答
1

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

于 2016-04-19T07:59:56.927 回答