Кеш фляги: список ключей на основе шаблона?
Я использую плагин Flask Cache с Redis в качестве бэкэнда для кеширования своего ответа API. Скажем, у меня есть API для получения пользователей и создания таких пользователей:
/api/users?page=1 GET
/api/users POST
Результат GET будет кэширован с полным URL-адресом в качестве ключа. Когда создается новый пользователь, я хотел бы удалить все ключи, начинающиеся с /api/users
- сейчас занимаюсь cache.clear()
но вряд ли это кажется необходимым.
Тем не менее, я не могу найти API для получения списка ключей. С redis-py
, E сть keys(*pattern)
API для этой цели. Есть ли аналогичный API для Flask Cache?
1 ответ
Flask-Cache выглядит устаревшим. Вы можете переключиться на Flask-Caching, который поддерживается вилкой Flask-Cache.
Удалить ключ Redis по шаблону
У вас есть два варианта:
- Подключитесь к Redis отдельно с помощью пакета redis. Используйте основные команды, предоставляемые пакетом, для поиска ключей на основе шаблона и их удаления.
- Используйте защищенные методы 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_cache_
по умолчанию CACHE_KEY_PREFIX
в Flask-Caching. Если вы использовали другое значение дляCACHE_KEY_PREFIX
, пожалуйста, используйте это (вместо flask_cache_
) в качестве префикса для вашего шаблона поиска.
Плагин Flask cache не предоставляет никакой точки доступа к необработанным командам redis. Вы можете использовать redis-py для подключения к одному экземпляру redis и базе данных для удаления ключей по шаблону.