Кеш фляги: список ключей на основе шаблона?

Я использую плагин 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 по шаблону

У вас есть два варианта:

  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_cache_ по умолчанию CACHE_KEY_PREFIXв Flask-Caching. Если вы использовали другое значение дляCACHE_KEY_PREFIX, пожалуйста, используйте это (вместо flask_cache_) в качестве префикса для вашего шаблона поиска.

Плагин Flask cache не предоставляет никакой точки доступа к необработанным командам redis. Вы можете использовать redis-py для подключения к одному экземпляру redis и базе данных для удаления ключей по шаблону.

Другие вопросы по тегам