Удалить кэш redis в Flask -Кэширование во время запроса - PullRequest
0 голосов
/ 05 марта 2020

Использование Redis в сочетании с Flask_caching. Когда данные изменяются, приложение использует cache.clear() для очистки ключей Redis, что работает. Однако, когда пользователь запрашивает страницу для записи, которая отсутствует в базе данных, redis заполняется ключами. Я хотел бы сохранить свой TTL по крайней мере неделю или дольше. Таким образом, приложению необходимо удалить недействительные ключи, так как они со временем будут заполняться. Я посмотрел на cache.delete(), redis.expire() и cache.set(), но ни один из них не работал во время запроса. Кажется, запись redis создается только после запроса, поэтому я не могу изменить TTL или удалить его.

Я принимаю решение по этому решению.

@home.route('/product/<int:product_id>')
@cache.cached()
def view_product(product_id):
  data = Product.query.filter_by(id=product_id).filter_by(active=True).first()
  if data is None:
    message = 'Invalid Product'

    prefix = current_app.config['CACHE_KEY_PREFIX']
    deleteBadCacheList = f"{prefix}INVALID"
    key = f"{prefix}view/{request.path}"
    redis.lpush(deleteBadCacheList, key)

    for key in redis.lrange(deleteBadCacheList, 0, -1):
      key = key.decode("utf-8")
      if redis.exists(key):
        redis.expire(key, 1)
        redis.lrem(deleteBadCacheList, 0, key)
  ....
  return render_template('product.html', flash=message, product=data.serialized)

При таком подходе запросы на недопустимые продукты сохраняются в ключе диапазона повторного ввода <prefix>INVALID. И каждый раз, когда делается другой запрос, для недопустимого продукта приложение удаляет элементы из предыдущего неудавшегося запроса. У меня есть ощущение, что есть лучший способ. Мне кажется, что большинство приложений будет иметь эту проблему. Есть предложения?

...