我正在使用带有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?
答案 0 :(得分:1)
烧瓶缓存看起来已过时。您可以切换到Flask-Caching,它是Flask-Cache的分支。
您有两种选择:
# 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)
⚠️即使此方法工作正常,但这些都是未记录的方法。我通过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实例和数据库以按模式删除密钥。