解读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之做一个小游戏
Sep 28 Python
Python自动化构建工具scons使用入门笔记
Mar 10 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
Jun 23 Python
python查询mysql,返回json的实例
Mar 26 Python
python实现傅里叶级数展开的实现
Jul 21 Python
Python多进程池 multiprocessing Pool用法示例
Sep 07 Python
Python实现从N个数中找到最大的K个数
Apr 02 Python
python对批量WAV音频进行等长分割的方法实现
Sep 25 Python
python 调整图片亮度的示例
Dec 03 Python
Python 处理表格进行成绩排序的操作代码
Jul 26 Python
python 详解turtle画爱心代码
Feb 15 Python
python数字图像处理之图像的批量处理
Jun 28 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数据库配置文件一般做法分享
2012/07/07 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
php利用事务处理转账问题
2015/04/22 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
async/await地狱该如何避免详解
2018/05/10 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
Vue formData实现图片上传
2019/08/20 Javascript
原生js实现日期选择插件
2020/05/21 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
用python登录Dr.com思路以及代码分享
2014/06/25 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
2015/06/21 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
Django实现网页分页功能
2019/10/31 Python
python 实现目录复制的三种小结
2019/12/04 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
英语三分钟演讲稿
2014/08/19 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL
python中数组和列表的简单实例
2022/03/25 Python
Go归并排序算法的实现方法
2022/04/06 Golang