简单的实现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