简单的实现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%} <div style= ""margin:5px;"" > {{item.catname}} </div> {%endfor%} |
运行之后,或者debug,你会发现,第一次,会从数据表中查询数据,以后会从缓存中得到数据,如果你是配置的数据库缓存方式,在my_cache_table中还能看到数据。
如果你没有在settings.py中配置 CACHES ,那么默认会使用localmem ,本地内存,一样的使用。
From:一号门
Previous:java 多线程基础之二:线程的中断(interrupt)
Next:Django url 标签的使用
COMMENTS