如果内容在缓存TTL过期之前发生更改,则更新缓存

时间:2016-11-02 16:19:19

标签: django rest caching redis

我在django应用中使用redis进行缓存。我也使用Django Rest Framework,这是我的问题。

我正在使用这样的缓存系统:

from django.views.decorators.cache import cache_page

urlpatterns = [
...
    url(r'^some_url/$', cache_page(CACHE_TTL)(SomeView.as_view())
...
]

此处,SomeView是一个继承自APIView的类。

现在假设我们向这个url发出请求,我们收到一个json对象,其中包含这个url返回的一个实例。

然后我们继续删除(使用django' s管理界面)该对象,并再次发出请求。预期的结果是一个空的json对象,但是我收到的是同一个对象没有改变,如果添加一个新对象,响应仍然只有一个对象。

一段时间后(缓存中请求的TTL)结果是正确的。

那么,我怎么能告诉django缓存条目不再有效呢?

1 个答案:

答案 0 :(得分:3)

来自Django’s cache framework

  

还有一些其他方法可以控制缓存参数。例如,HTTP允许应用程序执行以下操作:

     
      
  • 定义页面缓存的最长时间。

  •   
  • 指定缓存是否应始终检查较新版本,仅在没有更改时提供缓存内容。某些缓存可能会提供缓存内容,即使服务器页面也是如此更改,只是因为缓存副本尚未过期。

  •   
     

在Django中,使用cache_control视图装饰器指定这些缓存参数。 在此示例中,cache_control告诉缓存在每次访问时重新验证缓存并将缓存版本存储最多3,600秒:

from django.views.decorators.cache import cache_control

@cache_control(must_revalidate=True, max_age=3600)
def my_view(request):
    # ...

如果您正在缓存的页面频繁变化,并且您希望立即显示这些更改(并且缓存未自动检测或检查更改)而不等待缓存TTL,请使用cache_control