Использование 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
. И каждый раз, когда делается другой запрос, для недопустимого продукта приложение удаляет элементы из предыдущего неудавшегося запроса. У меня есть ощущение, что есть лучший способ. Мне кажется, что большинство приложений будет иметь эту проблему. Есть предложения?