解读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生成器(Generator)详解
Apr 13 Python
python 读取DICOM头文件的实例
May 07 Python
python中sys.argv函数精简概括
Jul 08 Python
python tornado微信开发入门代码
Aug 24 Python
安装docker-compose的两种最简方法
Jul 30 Python
python虚拟环境完美部署教程
Aug 06 Python
如何用Python来搭建一个简单的推荐系统
Aug 07 Python
利用Python校准本地时间的方法教程
Oct 31 Python
python分别打包出32位和64位应用程序
Feb 18 Python
如何用Python 加密文件
Sep 10 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
手把手教你用Django执行原生SQL的方法
Feb 18 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初学者头疼问题总结
2006/10/09 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
PHP使用反向Ajax技术实现在线客服系统详解
2019/07/01 PHP
js href的用法
2010/05/13 Javascript
XENON基于JSON变种
2010/07/27 Javascript
jquery操作select option 的代码小结
2011/06/21 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
JavaScript window.location对象
2014/11/14 Javascript
jquery实现清新实用的网页菜单效果
2015/08/28 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
JS设计模式之命令模式概念与用法分析
2018/02/06 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
[01:14:31]Secret vs VG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
python生成IP段的方法
2015/07/07 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
Python @property及getter setter原理详解
2020/03/31 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
2020/10/15 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
《临死前的严监生》教学反思
2014/02/13 职场文书
财务人员的自我评价范文
2014/03/03 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
校庆活动策划方案
2014/06/05 职场文书
学校开学标语
2014/10/06 职场文书
出纳年终工作总结2014
2014/12/05 职场文书
小学信息技术教学反思
2016/02/16 职场文书
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers