解读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 相关文章推荐
python判断图片宽度和高度后删除图片的方法
May 22 Python
老生常谈Python基础之字符编码
Jun 14 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
Nov 06 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
Nov 30 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
Feb 20 Python
python控制台实现tab补全和清屏的例子
Aug 20 Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 Python
Python读取文件内容为字符串的方法(多种方法详解)
Mar 04 Python
python中取绝对值简单方法总结
Jul 24 Python
python操作ini类型配置文件的实例教程
Oct 30 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
Feb 06 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
PHP微信开发之模板消息回复
2016/06/24 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
js判断上传文件的类型和大小示例代码
2013/10/18 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
2014/06/26 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
angularjs表格分页功能详解
2016/01/21 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
jQuery dataTables与jQuery UI 对话框dialog的使用教程
2016/09/02 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
原生js实现瀑布流布局
2017/03/08 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
Vue+Vux项目实践完整代码
2017/11/30 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
解决vue跨域axios异步通信问题
2019/04/17 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
Python httplib,smtplib使用方法
2008/09/06 Python
python dict remove数组删除(del,pop)
2013/03/24 Python
python实现停车管理系统
2018/11/30 Python
Python 自动登录淘宝并保存登录信息的方法
2019/09/04 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
瑞典快乐袜子:Happy Socks
2018/02/16 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
知识竞赛主持词
2014/03/26 职场文书
政府绩效管理实施方案
2014/05/04 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
2014年个人年终总结
2015/03/09 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书