缓存日历日期的Django查询集

Bel*_*dez 2 python django memcached django-cache django-queryset

我有一个查询,结果每天只改变一次.对于我为该页面获得的每个请求来说,这似乎是一种浪费.我正在调查使用memcached.

我该怎么开始?任何人都有任何建议或陷阱我应该避免使用Django的缓存?我应该在模板或视图中缓存吗?

这个问题可能看起来很模糊,但这只是因为我以前从未处理过缓存.所以,如果有什么东西我可以详细说明,只问.

Per Ken Cochrane:

  1. 此数据的更改频率如何:相关数据将在该日历日期锁定.因此,举例来说,我将提取2011年1月30日的数据,我可以整天提供缓存副本,直到2011年1月31日,它将被刷新.

  2. 我是否在多个地方使用此数据:仅在一个视图中.

  3. 它将包含多少数据:平均包含大约15个字段的10个模型对象,其中最大的是a CharField(max_length=120).我会将使用的字段数减少values()到大约一半.

Ken*_*ane 8

通常在我决定在哪里进行缓存之前,我会问自己一些问题.

  1. 这些数据多久会发生变化
  2. 我是否在多个地方使用此数据?
  3. 它将有多少数据

由于我不知道您的应用程序的所有细节,我将做出一些假设.

  1. 您有一个视图,要么接受日期或使用当前日期查询数据库以提取该日期的所有日历事件.
  2. 您只在一个模板上显示此信息,
  3. 数据量不是太大(少于100个条目).

有了这些假设,你有3个选择.1.缓存模板2.缓存视图3.缓存查询集

通常当我进行缓存时,我会缓存查询集,这使我可以更好地控制我想要缓存数据的方式,并且我可以在多个地方重用相同的缓存数据.

我发现缓存查询集的最简单方法是在模型管理器中为相关模型执行此操作.我会创建一个像get_calender_by_date(date)这样的方法来处理查询和缓存.这是一个粗略的模型

CACHE_TIMEOUT_SECONDS = 60 * 60 * 24 # this is 24 hours

class CalendarManager(models.Manager):

    def get_calendar_by_date(self, by_date):
        """ assuming date is a datetime object """
        date_key = by_date.strftime("%m_%d_%Y")
        cache_key = 'CAL_DATE_%s' % (date_key)
        cal_date = cache.get(cache_key)
        if cal_date is not None:
            return cal_date

        # not in cache get from database
        cal_date = self.filter(event_date=by_date)

        # set cal_date in cache for later use
        cache.set(cache_key, cal_date, CACHE_TIMEOUT_SECONDS)
        return cal_date
Run Code Online (Sandbox Code Playgroud)

缓存时要注意的一些事项

  1. 确保可以对存储在缓存中的对象进行pickle
  2. 由于memcache不知道你需要什么日子,所以你需要确保不要过度缓存.例如,如果它是1月21日中午并且您缓存了24小时,那么日历信息将显示到1月22日中午,这可能不是您要查找的内容,因此请确保在设置查询时间时要么将其设置为较小的值,那么它会更快到期,或者您计算缓存的时间长度,以便在您希望它过期时到期.
  3. 确保您知道要缓存的对象的大小.如果你的memcache实例只有16MB的存储空间,但你想存储32MB的数据,那么缓存对你来说不会有多大帮助.

缓存模板或视图时,您需要注意以下内容

  1. 设置你的缓存超时,使其不是太大,我不认为你可以编程更改模板缓存超时,它是硬编码的,所以如果你设置得太高,你最终会有一个页面出来约会 您应该能够以编程方式更改缓存时间,因此它更安全一些.
  2. 如果您正在缓存模板,并且模板上有其他信息是动态的并且一直在更改,请确保仅将缓存标记放在要缓存一段时间的页面部分周围.如果你把它放在错误的地方,你可能会得到错误的结果.

希望这能为您提供足够的信息以便入门.祝好运.