简单的实现django的缓存
By:Roy.LiuLast updated:2013-01-22
最近在改版自己原来写的一个基于 django cms,由于cms 系统的分类,一旦确定之后,就很少改变,而且这个分类在每个页面都需要展示,因为我是放在模板的顶部,因为是动态页面,所以,每次打开一个页面,就得到数据库里面去查询这些分类,个人感觉没有必要。因此就想把这些不常用的东西做个缓存,以后每次都检查在缓存中是否存在,有则读取,没有则从数据库中得到数据,然后放入缓存中。django 的官方文档很详细的介绍了各种缓存:
1. 用文件系统做缓存
2. 用数据库做缓存
3. 用MemcachedCache作缓存
4. 用本地内存做缓存
5. 自定义缓存.
我测试用了数据库方式,local mem方式. 其他方式类似的,可以参考官方文档:
https://docs.djangoproject.com/en/dev/topics/cache/
以数据库缓存为例,首先需要在settings.py中配置:
如果你的数据库当中没有 my_cache_table 这个表,你还得运行如下命令:
然后再写测试的应用,假设有如下model:
在views.py 中写如下测试方法:
测试页面:
运行之后,或者debug,你会发现,第一次,会从数据表中查询数据,以后会从缓存中得到数据,如果你是配置的数据库缓存方式,在my_cache_table中还能看到数据。
如果你没有在settings.py中配置 CACHES ,那么默认会使用localmem ,本地内存,一样的使用。
1. 用文件系统做缓存
2. 用数据库做缓存
3. 用MemcachedCache作缓存
4. 用本地内存做缓存
5. 自定义缓存.
我测试用了数据库方式,local mem方式. 其他方式类似的,可以参考官方文档:
https://docs.djangoproject.com/en/dev/topics/cache/
以数据库缓存为例,首先需要在settings.py中配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table',
}
}
如果你的数据库当中没有 my_cache_table 这个表,你还得运行如下命令:
python manage.py createcachetable my_cache_table
然后再写测试的应用,假设有如下model:
class MyCategory(models.Model):
autoid = models.IntegerField(primary_key=True)
email = models.CharField(max_length=450, blank=True)
comtype = models.CharField(max_length=60, blank=True)
catname = models.CharField(max_length=450, blank=True)
coverimg = models.CharField(max_length=750, blank=True)
remark = models.TextField(blank=True)
totalview = models.IntegerField(null=True, blank=True)
class Meta:
db_table = u'my_category'
在views.py 中写如下测试方法:
def memcache(request):
context = {}
cats = cache.get('mycategory',None)
if not cats:
cats = models.MyCategory.objects.all()
cache.set('mycategory',cats,60*30)
cache.set('mydata','buhao',60*15)
context['cats'] = cats
return render_to_response('memcache.html',context)
测试页面:
{%for item in cats%}
{{item.catname}}
{%endfor%}
运行之后,或者debug,你会发现,第一次,会从数据表中查询数据,以后会从缓存中得到数据,如果你是配置的数据库缓存方式,在my_cache_table中还能看到数据。
如果你没有在settings.py中配置 CACHES ,那么默认会使用localmem ,本地内存,一样的使用。
From:一号门
Previous:java 多线程基础之二:线程的中断(interrupt)
Next:Django url 标签的使用

COMMENTS