解读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的web.py框架实现类似Django的ORM查询的教程
May 02 Python
python读取oracle函数返回值
Jul 18 Python
Python中执行存储过程及获取存储过程返回值的方法
Oct 07 Python
基于Python中capitalize()与title()的区别详解
Dec 09 Python
Python实现迭代时使用索引的方法示例
Jun 05 Python
python中用logging实现日志滚动和过期日志删除功能
Aug 20 Python
简单了解python数组的基本操作
Nov 26 Python
python 创建一维的0向量实例
Dec 02 Python
pycharm 激活码及使用方式的详细教程
May 12 Python
Python使用tkinter实现摇骰子小游戏功能的代码
Jul 02 Python
Python Matplotlib绘图基础知识代码解析
Aug 31 Python
python爬取招聘要求等信息实例
Nov 20 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
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
php页面缓存ob系列函数介绍
2012/10/18 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
在PHP程序中使用Rust扩展的方法
2015/07/03 PHP
浅谈php7的重大新特性
2015/10/23 PHP
浅谈php中curl、fsockopen的应用
2016/12/10 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
js getElementsByTagName的简写方式
2010/06/27 Javascript
Javascript 类型转换方法
2010/10/24 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
2013/11/23 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
2017/07/23 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
[54:06]OG vs TNC 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python验证码识别的实例详解
2016/09/09 Python
Python基础语言学习笔记总结(精华)
2017/11/14 Python
python实现自动登录后台管理系统
2018/10/18 Python
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
500行python代码实现飞机大战
2020/04/24 Python
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
消防安全培训工作总结
2015/10/23 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
Css预编语言及区别详解
2021/04/25 HTML / CSS
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs