2015-07-20 59 views
1

我使用redis作为缓存后端。我正试图从序列化器中获取redis缓存数据。将redis缓存提取到django rest框架串行器

我的代码是:

class CocView(APIView): 
""" 
Celery and Redis Usage 
""" 
def get(self,request): 

    data = cache.get('alldata') 
    print "In the Cache",data 
    if not data: 
     print "in the database" 
     data = Coc.objects.values('cache_id', 'username', 'email') 
     test_result=mytask.delay(data) 
     test_result=mytask.delay() 

    serializer = CocSerializer(data, many=True) 
    return Response(serializer.data) 

我更新已经使用把我的数据库中已有的数据。

我正在将redis缓存数据传递到未更新但仍显示数据库更新数据的串行器。

这意味着我的序列化器会自动从数据库中获取数据。 我不知道它是怎么回事。

在我的settings.py中,我有以下用于redis的中间件。

'django.middleware.cache.UpdateCacheMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.cache.FetchFromCacheMiddleware', 

在我的task.py中,我有以下任务。

from __future__ import absolute_import 
from app.models import Coc 
from app.celery import app 
from django.core.cache import cache 
from app.serializers import * 
from app.views import * 

@app.task 
def mytask(data): 
    try: 
     dataa = data 
     cache.set('alldata', dataa,60*45) 
     return 

    except ValueError: 
     return "error" 

如果有人对它的实施有什么建议,请告诉我们。

回答

0

在你的shell

from django.core.cache import cache 

试试这个,然后键入

cache.get('alldata') 

如果没有返回,这意味着你的缓存没有被设置与corrresponding关键。在这种情况下,通过设置进行缓存的发言:

cache.set('alldata') = {<your data>} 

这将设置你的缓存,那么它应该从缓存中的数据来工作。

您收到的数据是Noneempty,因此每次尝试向串行器发送数据时都会查询数据库。

+0

实际上,我们正在将我们的缓存设置在芹菜任务文件中。 –

+0

首先我需要了解'dataa = data'的原因是什么:P,抛开笑话,我能想到的原因是你的缓存没有设置是因为你的芹菜任务没有运行,因此无法设置缓存为你或我能想到的另一个原因是你的芹菜任务可能已经成功运行,但你在任务实际运行之前访问缓存,因此你得到一个没有数据。为此尝试将缓存设置为不作为芹菜任务,但将其设置为某个脚本,然后尝试访问。 –