Django缓存用户的个人资料

时间:2012-08-21 21:13:49

标签: django caching properties redis profile

我正在尝试缓存对Django配置文件对象的访问。我正在使用django-redis-cache来缓存此项目中的数据。如果不存在,我正在使用片段自动创建配置文件。这是我正在做的简化版本(没有缓存):

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

每当需要配置文件信息时,都会访问user.profile属性。这可以正常工作,但是,当我尝试缓存配置文件属性时,例如在图1中,我仍然看到正在选择配置文件但没有利用缓存的SQL查询(在django-debug-toolbar中)。

具体来说,图表2中的cache_object_list()函数是一些代码,用于检查缓存值是否可用。如果是,则调用缓存密钥。如果没有,它运行传递给它的查询(通过“查询”参数)并缓存结果。

cache_object_list()打印“Hit”或“Miss”,表示缓存命中或未命中。刷新两次后,所有内容都会报告为命中(按预期方式)。但是,django-debug-toolbar仍然没有显示查询计数的减少,并显示选择配置文件的查询。

有没有人对如何确保user.profile在可用时提取配置文件的缓存版本有任何建议?谢谢你的阅读。

图表1:myproject / myapp / models.py

def get_or_create_profile(u):
    return cache_utils.cache_single_object(
        "user_get_or_create_profile",
        u.id, UserProfile.objects.get_or_create(user=u)[0]) 

User.profile = property(lambda u: cache_utils.cache_single_object(
                    "user_get_or_create_profile", u.id,  
                     get_or_create_profile(u)))

图表2:myproject / cache_utils.py

def cache_single_object(key_prefix, id, query, timeout=500):
    key = '%s_%s' % (key_prefix, id)
    object_list = cache.get(key, None)
    if object_list is None:
        print "Miss %s" % (key)
        object_list = query
        cache.set(key, object_list, timeout)
    else:
        print "Hit  %s" % (key)
    return object_list

图表3:myproject / templates / mytemplate.py

<div>Example of what's in the template </div>
{{ myobject.owner.profile.bio }} 

1 个答案:

答案 0 :(得分:2)

我认为问题与您定义方法的方式有关....

User.profile = property(lambda u: cache_utils.cache_single_object(
                "user_get_or_create_profile", u.id,  
                 get_or_create_profile(u)))

当您访问个人资料属性时,您将始终调用调用的方法get_or_create_profile(u):

return cache_utils.cache_single_object(
    "user_get_or_create_profile",
    u.id, UserProfile.objects.get_or_create(user=u)[0]) 

拥有UserProfile.objects.get_or_create(user = u)即使您已经拥有缓存中的数据,每次都会创建查询。我认为您应该尝试使用util方法,每次调用它时都不会评估查询。也许是这样的:https://stackoverflow.com/a/2216326/234304