问题描述
我已经在我的Web应用程序中添加了一个简单的缓存,当我删除或添加新对象时,缓存在我设置的时间(2分钟)之后不会刷新。
它似乎冻结了。当我重新启动应用程序时,它会被刷新。
我在memached和locmemcache上尝试过。
INDEX_LIST_CACHE_KEY =index_list_cache_key
class IndexView(BaseView):
queryset = Advert.objects.all()。select_related('category','location')
template_name =adverts / category_view.html
def get_queryset(self):
queryset = cache.get(INDEX_LIST_CACHE_KEY)
如果查询是没有:
queryset = self.queryset
cache.set(INDEX_LIST_CACHE_KEY,queryset,2 * 60)
返回查询
为什么缓存在这个项目中的行为是如此?
编辑 - settings.py:
for locmemcache
CACHES = {
'default':{
' BACKEND':'django.core.cache.backends.locmem.LocMemCache',
'LOCATION':'oglos-cache'
}
}
for memcached
code> CACHES = {
'default':{
'BACKEND':'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION':'127.0。 0.1:11211',
}
}
因为通过在类定义中切片查询器,所以您已经在类定义时刻(即服务器启动时)对它进行了评估。因此,缓存正在刷新,但只能使用一组旧的项目。不要在类级别做这个切片:从 get_queryset
返回结果时执行此操作。
I've added a simple caching to my web application and when I delete or add new object the cache does not get refreshed after the peroid of time (2 minutes) that I've set.
It looks like it froze. When I restart my application then it gets refreshed.
I tried it on memached and locmemcache.
INDEX_LIST_CACHE_KEY = "index_list_cache_key"
class IndexView(BaseView):
queryset = Advert.objects.all().select_related('category', 'location')[:25]
template_name = "adverts/category_view.html"
def get_queryset(self):
queryset = cache.get(INDEX_LIST_CACHE_KEY)
if queryset is None:
queryset = self.queryset
cache.set(INDEX_LIST_CACHE_KEY, queryset, 2 * 60)
return queryset
Why caching behaves like that in this project?
Edit - settings.py:
for locmemcache
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'oglos-cache'
}
}
for memcached
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
Because by slicing the queryset in the class definition, you've evaluated it then and there - at class definition time, ie when the server starts up. So the cache is being refreshed, but only with an old set of items. Don't do that slice at class level: do it when returning the results from get_queryset
.
这篇关于Django缓存不会刷新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!