简单的实现django的缓存

摘要: 最近在改版自己原来写的一个基于 django cms,由于cms 系统的分类,一旦确定之后,就很少改变,而且这个分类在每个页面都需要展示,因为我是放在模板的顶部,因为是动态页面,所以,每次打开一个页面,就得到数据库里面去查询这些分类,个人感觉没有必要。因此就想把这些不常用的东西做个缓存,以后每次都检查在缓存中是否存在,有则读取,没有则从数据库中得到数据,然后放入缓存中。

最近在改版自己原来写的一个基于 django cms,由于cms 系统的分类,一旦确定之后,就很少改变,而且这个分类在每个页面都需要展示,因为我是放在模板的顶部,因为是动态页面,所以,每次打开一个页面,就得到数据库里面去查询这些分类,个人感觉没有必要。因此就想把这些不常用的东西做个缓存,以后每次都检查在缓存中是否存在,有则读取,没有则从数据库中得到数据,然后放入缓存中。django 的官方文档很详细的介绍了各种缓存:
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 ,本地内存,一样的使用。

上一篇: java 多线程基础之二:线程的中断(interrupt)
下一篇: Django url 标签的使用

Avatar

egua 评论于: 2015-03-11

唯一漏掉的一点是,应该: from django.core.cache import cache
这样才能识别cache.

Avatar

珍惜23 评论于: 2013-11-20

请问,为什么我不能用memcache 来做表级的缓存呢?总是报错。
[reply=轻舞肥羊,2013-11-20 07:47 PM]能把具体的错误描述下吗?我测试是可以的。可能环境不一样。[/reply]
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号