请求期间删除flask缓存中的redis缓存

toe95027  于 2021-06-09  发布在  Redis
关注(0)|答案(0)|浏览(266)

结合使用redis和缓存。当应用程序使用的数据发生变化时 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 . 而且每次提出另一个请求时,对于一个无效的产品,应用程序都会从以前失败的请求中删除项目。我觉得有更好的办法。在我看来,大多数应用程序都会有这个问题。有什么建议吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题