1

在我看来,我有以下几点

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

现在我添加了一个缓存,这样我就不必一直执行“繁重的计算”。所以新代码看起来像

设置.py

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

}

视图.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)在 return HttpResponse 语句之后进行调用以刷新缓存值并进行大量计算(其中 return statmenet 刚刚返回过期值)或者可以通过异步调用来做到这一点?

4

2 回答 2

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将其与后台任务一起缓存。

于 2013-03-21T15:08:18.460 回答
-1

Here is what worked for me:

1) create a global variable, and when you set the cache, set this global variable too. if the cache has expired, your global variable is still around with expired values, so send that in response. and use threading to update the cache and global variable.

2) use python threading

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")
于 2013-03-21T17:21:34.423 回答