【问题标题】:Update cache if content changes before cache TTL expires如果在缓存 TTL 过期之前内容发生更改,则更新缓存
【发布时间】:2017-03-16 01:15:29
【问题描述】:

我正在使用 redis 在 django 应用程序中进行缓存。我也在使用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 的管理界面)该对象,并再次发出请求。预期的结果是一个空的 json 对象,但我收到的是同一个对象没有改变,如果添加一个新对象也会发生同样的情况,响应仍然只有一个对象。

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

那么,我如何告诉 django 缓存条目不再有效?

【问题讨论】:

  • @alzaro,这不是同一个问题,你引用的问题的答案是真的解决了我的问题,但原来的问题不一样。我不想使缓存过期,我希望更新缓存

标签: django rest caching redis


【解决方案1】:

来自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

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多