2013-03-20 97 views
1

在我的意见,我有以下Django的缓存得到过期项

@require_POST 
def loadVals(request): 
    result = //do some heavy calculations 
    return HttpResponse(json.dumps({"data": result}), content_type="application/json") 

现在我已经添加了一个缓存,这样,我没有执行“重calclations”所有的时间。因此,新的代码看起来像

settings.py

CACHES = { 
'default': { 
    'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 
    'LOCATION': 'unique-snowflake' 
} 

}

views.py

from django.core.cache import get_cache 

@require_POST 
def loadVals(request): 
    cache = get_cache('default') 
    result = cache.get('res') 
    if result == NONE: 
    result = //do some heavy calculations 
    cache.set('res', result, 30) 
    return HttpResponse(json.dumps({"data": result}), content_type="application/json") 
    else: 
    return HttpResponse(json.dumps({"data": result}), content_type="application/json") 

我想要做的却是,即使是高速缓存已经过期,我想保存前端用户一些等待时间(因为繁重的计算),并且只返回最后过期的值。 然后刷新缓存。

我如何

1)获取过期缓存的值?因为如果缓存已过期,cache.get('res')将返回NONE

2)在返回HttpResponse语句之后进行调用以刷新缓存值并执行大量计算(其中返回statmenet刚刚返回了过期值)或者可能通过异步调用来做到这一点?

回答

2

首先,你的代码有一些语法问题。 其次,您无法从django缓存中获取过期的值。过期的值一旦到期就会被删除,之后它们就不存在了。

如果您希望为这种情况存储更长的值,则需要将它们存储在更持久的存储器(如数据库)中,而不是为此创建缓存。

或者你可以缓存你的结果两次其中一个是长,并从第二高速缓存服务:

from django.core.cache import get_cache 

@require_POST 
def loadVals(request): 
    cache = get_cache('default') 
    result = cache.get('res') or cache.get('res_long') 
    if result is None: 
     result = //do some heavy calculations 
     cache.set('res', result, 30) 
     cache.set('res_long', result, 60*60*24*7) # cache for a week 
    return HttpResponse(json.dumps({"data": result}), content_type="application/json") 

这仍然不是一个伟大的方法,因为你还必须做一些事情来重新缓存短缓存。此外,它不是很好,因为你用双重数据超载你的缓存后端。

如果您希望用户始终获取缓存内容,请尝试使用Celery作为后台任务来缓存它。

0

这里是我工作:

1)创建一个全局变量,当你设置缓存,也设置这个全局变量。如果缓存已过期,则您的全局变量仍处于过期值范围内,因此请发送该响应。并使用线程更新缓存和全局变量。

2)使用Python穿线

import threading 
def loadVals(): 
    threading.Thread(group=None, target=methodToDoheavyCalculations).start() 
    # return the expired cache in the meanwhile 
    return HttpResponse(json.dumps(EXPIRED_VALUES), content_type="application/json") 
+0

尼斯使用螺纹。不幸的是,wsgi没有保证这个过程将在下一个请求中出现。所以使用线程永久缓存是一种反模式。 – Wtower 2016-12-23 08:36:20