2012-01-11 53 views
1

我使用Python 2.6.5和Django的1.3的Python Memcached的:缓存对象

让我说,我有这样的模型:

class Company(models.Model): 
    name = models.CharField(...) 
    type = models.SmallIntegerField(...) 
    .... 

    def check_condition(self, someParam): 
     do someThing... 
     return someThing 

这是一个使用频繁的模式,所以我一直基本数据INA字典和缓存此字典

aComp = Company.objects.get(pk=somevalue) 
compDict = {'name':aComp.name, 'type': aComp.type...} 
cache.set('companyInfo', compDict) 

一切都很好,但在某些情况下,我需要调用的方法Company但因为我缓存公司信息,我不知道是否这是很好的缓存对象或不...喜欢

compDict = {'name':aComp.name, 'type': aComp.type, 'obj':aComp} 

而且使用它

myComp = cache.get('companyInfo') 
compInst = myComp['obj'] 
compInst.check_condition(aParam) 

,我不知道它是多么有效的缓存对象,并用于缓存的对象实例方法调用那样?

+2

如果你缓存整个对象,有没有点到字典都没有:只有通过'aComp'到'cache.set'。 – 2012-01-11 11:24:31

+0

@DanielRoseman - ACOMP倒是Django的QS对象(没有命中DB但即查询集尚未进行评估)。我尝试设置OBJ,与cache.get(“OBJ”)导致相同数量的查询 - 因为它得到了评估模板即obj.attr – 2016-04-25 12:47:22

+0

我正在寻找一种方式来缓存昂贵的查询 - 用最小的开发开销(巨大代码库)。 – 2016-04-25 12:49:25

回答

2

没有与它没有任何问题。当然,酸洗对象会有一些开销,而不是原始数据,但你不会注意到它。

请记住,当你访问ForeignKey的,ManyToManyField和OneToOneField,你会做反正DB命中。但是你可以手动缓存这些关系。