解读Django框架中的低层次缓存API


Posted in Python onJuly 24, 2015

有些时候,对整个经解析的页面进行缓存并不会给你带来太多好处,事实上可能会过犹不及。

比如说,也许你的站点所包含的一个视图依赖几个费时的查询,每隔一段时间结果就会发生变化。 在这种情况下,使用站点级缓存或者视图级缓存策略所提供的整页缓存并不是最理想的,因为你可能不会想对整个结果进行缓存(因为一些数据经常变化),但你仍然会想对很少变化的部分进行缓存。

针对这样的情况,Django提供了简单低级的缓存API。 你可以通过这个API,以任何你需要的粒度来缓存对象。 你可以对所有能够安全进行 pickle 处理的 Python 对象进行缓存: 字符串、字典和模型对象列表等等。 (查阅 Python 文档可以了解到更多关于 pickling 的信息。)

缓存模块django.core.cache拥有一个自动依据CACHE_BACKEND设置创建的django.core.cache对象。

>>> from django.core.cache import cache

基本的接口是 set(key, value, timeout_seconds) 和 get(key) :

>>> cache.set('my_key', 'hello, world!', 30)
>>> cache.get('my_key')
'hello, world!'

timeout_seconds 参数是可选的, 并且默认为前面讲过的 CACHE_BACKEND 设置中的 timeout 参数.

如果缓存中不存在该对象,那么cache.get()会返回None。

# Wait 30 seconds for 'my_key' to expire...

>>> cache.get('my_key')
None

我们不建议在缓存中保存 None 常量,因为你将无法区分你保存的 None 变量及由返回值 None 所标识的缓存未命中。

cache.get() 接受一个 缺省 参数。 它指定了当缓存中不存在该对象时所返回的值:

>>> cache.get('my_key', 'has expired')
'has expired'

使用add()方法来新增一个原来没有的键值。 它接受的参数和set()一样,但是并不去尝试更新已经存在的键值。

>>> cache.set('add_key', 'Initial value')
>>> cache.add('add_key', 'New value')
>>> cache.get('add_key')
'Initial value'

如果想确定add()是否成功添加了缓存值,你应该测试返回值。 成功返回True,失败返回False。

还有个get_many()接口。 get_many() 所返回的字典包括了你所请求的存在于缓存中且未超时的所有键值。

>>> cache.set('a', 1)
>>> cache.set('b', 2)
>>> cache.set('c', 3)
>>> cache.get_many(['a', 'b', 'c'])
{'a': 1, 'b': 2, 'c': 3}

最后,你可以用 cache.delete() 显式地删除关键字。

>>> cache.delete('a')

也可以使用incr()或者decr()来增加或者减少已经存在的键值。 默认情况下,增加或减少的值是1。可以用参数来制定其他值。 如果尝试增减不存在的键值会抛出ValueError。

>>> cache.set('num', 1)
>>> cache.incr('num')
2
>>> cache.incr('num', 10)
12
>>> cache.decr('num')
11
>>> cache.decr('num', 5)
6

注意

incr()/decr()方法不是原子操作。 在支持原子增减的缓存后端上(最著名的是memcached),增减操作才是原子的。 然而,如果后端并不原生支持增减操作,也可以通过取值/更新两步操作来实现。

Python 相关文章推荐
python3使用tkinter实现ui界面简单实例
Jan 10 Python
详解Python的Django框架中的模版相关知识
Jul 15 Python
python爬虫爬取快手视频多线程下载功能
Feb 28 Python
python爬虫增加访问量的方法
Aug 22 Python
Python 实现顺序高斯消元法示例
Dec 09 Python
python3 sorted 如何实现自定义排序标准
Mar 12 Python
django rest framework使用django-filter用法
Jul 15 Python
Python 代码调试技巧示例代码
Aug 11 Python
python实现发送带附件的邮件代码分享
Sep 22 Python
Django正则URL匹配实现流程解析
Nov 13 Python
浅谈Python 中的复数问题
May 19 Python
Python+Tkinter打造签名设计工具
Apr 01 Python
Python的Django框架中模板碎片缓存简介
Jul 24 #Python
Django框架下在URLconf中指定视图缓存的方法
Jul 23 #Python
详解Django框架中的视图级缓存
Jul 23 #Python
Django中的CACHE_BACKEND参数和站点级Cache设置
Jul 23 #Python
简介Django框架中可使用的各类缓存
Jul 23 #Python
浅析Python的Django框架中的Memcached
Jul 23 #Python
详解Django中的权限和组以及消息
Jul 23 #Python
You might like
星际原理概述
2020/03/04 星际争霸
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
HTML DOM的nodeType值介绍
2011/03/31 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
用json方式实现在 js 中建立一个map
2014/05/02 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
JavaScript中Function()函数的使用教程
2015/06/04 Javascript
Javascript中setTimeOut和setInterval的定时器用法
2015/06/12 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
2015/09/16 Javascript
jqGrid表格应用之新增与删除数据附源码下载
2015/12/02 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
2017/01/19 Javascript
jQuery实现选中行变色效果(实例讲解)
2017/07/06 jQuery
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
VUE 全局变量的几种实现方式
2018/08/22 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
Python牛刀小试密码爆破
2011/02/03 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
2019/04/05 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
Python基于callable函数检测对象是否可被调用
2020/10/16 Python
Django 实现图片上传和下载功能
2020/12/31 Python
全球精选男装和家居用品:Article
2020/04/13 全球购物
4s店机修工岗位职责
2013/12/20 职场文书
班主任工作年限证明
2014/01/12 职场文书
超市开学活动方案
2014/03/01 职场文书
家长通知书家长评语
2014/04/17 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
党员自我评价2015
2015/03/03 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
nginx请求限制配置方法
2021/07/09 Servers