得一8GB内存服务器便肆无忌惮使用redis缓存

开始把软件部署到新的设备中。主要是看上CPU和磁盘IOPS都比之前使用的辣鸡设备强很多。尤其是磁盘,有了Raid10的支持。稍微测试了一下比原来的性能高3~4倍甚至更多。而且整个软件好像并没有做线程的设计,再感觉Python对CPU的要求又比较高。不知道是不是程序哪里的问题,反正,并没有预期的运行快。早在年初便想聊聊django cache的了。无奈,直到现在才稍微能写得出手,都是因为你笨啊。

这里的Django项目采用redis-server作为django 的缓存BACKEND。主要是感觉它的使用相对其他比较简单,配置也方便,另外—-还算挺主流。这里不说明django配置redis作为缓存后端的相关事情。仅聊聊django自带框架中的基本的底层缓存操作。(其实官方文档都是挺详细了)

django缓存框架源码位置: site-packages/django/core/cache

缓存基本方法:
from django.core.cache import cache
新建对象缓存:
cache.set('cache_key', 'cache_object',  timeout='cache_timeout')
获取缓存:
cache.get('cache_key')
#没有缓存时会返回None,**因此注意最好不要缓存对象是有可能是None的key
删除缓存:
cache.delete('cache_key')

好了,有了上面这些东西,你大概便可建立你要django缓存了。

#缓存key的制作#

缓存key对应某个redis库来说应该是唯一的。所以,你要缓存的东西必须有个unique的区分。比如某个Model的object/objects都是没有问题的。object比较简单,使用self.pk便是唯一,类似objects这样的查询集,也是可以缓存,把查询的sql字符串当作key来缓存查询便实现了。

最好,django cache框架中还有个文件叫utils的文件。里面有自带生产cache key 的方法,见下面源码:

代码很少,而且只需要import一下就可以直接使用了。使用示例:

object = Rack.objects.get(pk=110)

Rack这个model类下面有个units的属性查询,对于我这里,获取这个数据的查询比较多,而且,特殊需求的是,必须是数据库存储的真是情况(即这里的数据存储有改变了后一定要更新缓存的)Note:程序经常要运行: objects.units这个操作。

下面是缓存这个查询的示例代码:

那么,上面红色字体的需求怎么实现呢?我这缓存都限定了缓存3600s了。嗯,可以通过django model signals 来更新这个缓存,说明一下,Units这个述U位信息,是设备信息模型类的一个多对多字段。所以,当设备信息更新了U位信息即当作这个U位的属性产生了改变。这时需要删除机柜的U位信息缓存了。见下面代码:

就是这样,实现当缓存的对象有改变的时候更新缓存。

django cache框架中还有一个很方便使用的就是template缓存。有兴趣可查阅相关文档。

发表评论

电子邮件地址不会被公开。 必填项已用*标注