通常在我决定在哪里进行缓存之前,我会问自己几个问题。
- 此数据多久更改一次
- 我是否在不止一个地方使用这些数据
- 会有多少数据
由于我不知道您的应用程序的所有细节,我将做一些假设。
- 您有一个视图,该视图要么接受日期,要么使用当前日期来查询数据库以提取该日期的所有日历事件。
- 您只在一个模板上显示此信息,
- 数据量不太大(少于 100 个条目)。
有了这些假设,您有 3 个选项。1. 缓存模板 2. 缓存视图 3. 缓存查询集
通常,当我进行缓存时,我会缓存查询集,这使我可以更好地控制我想要如何缓存数据,并且我可以在多个地方重用相同的缓存数据。
我发现缓存查询集的最简单方法是在 ModelManger 中为相关模型执行此操作。我会创建一个像 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
缓存时需要注意的一些事项
- 确保您存储在缓存中的对象可以腌制
- 由于 memcache 不知道今天是哪一天,因此您需要确保不会过度缓存。例如,如果它是 1 月 21 日中午并且您缓存了 24 小时,则该日历信息将显示到 1 月 22 日中午,这可能不是您要查找的内容,因此请确保您在设置查询时间时要么将其设置为一个较小的值,以便它更快地过期,要么您计算缓存多长时间,以便它在您希望它过期时过期。
- 确保您知道要缓存的对象的大小。如果你的 memcache 实例只有 16MB 的存储空间,但你想存储 32MB 的数据,那么缓存对你没有多大用处。
缓存模板或视图时,您需要注意以下事项
- 设置您的缓存超时,使其不会太大,我认为您不能以编程方式更改模板缓存超时,并且它是硬编码的,因此如果您将其设置得太高,您最终会得到一个页面日期。您应该能够以编程方式更改缓存时间,因此更安全一些。
- 如果您正在缓存模板并且模板上的其他信息是动态的并且一直在变化,请确保您只将缓存标记放在您想要缓存一段时间的页面部分周围。如果你把它放在错误的地方,你可能会得到错误的结果。
希望这可以为您提供足够的信息来开始。祝你好运。