将 redis 与 Flask_caching 结合使用。当数据发生变化时,应用程序用于cache.clear()
清除 redis 键,这很有效。但是,当用户请求页面以获取不在数据库中的记录时, redis 会填满键。我想保持我的 TTL 至少一周或更长时间。因此应用程序需要删除无效的密钥,因为它们会随着时间的推移填满 redis。我看了看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)
使用这种方法,对无效产品的请求存储在 redis 范围键<prefix>INVALID
中。每次发出另一个请求时,对于无效产品,应用程序都会从先前失败的请求中删除项目。我感觉有更好的方法。在我看来,大多数应用程序都会有这个问题。有什么建议么?