解读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最基本的数据类型以及对元组的介绍
Apr 14 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
Python开发的实用计算器完整实例
May 10 Python
python中利用Future对象回调别的函数示例代码
Sep 07 Python
Python数据拟合与广义线性回归算法学习
Dec 22 Python
python实现定时自动备份文件到其他主机的实例代码
Feb 23 Python
django加载本地html的方法
May 27 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
详解Python函数式编程—高阶函数
Mar 29 Python
pytorch 预训练层的使用方法
Aug 20 Python
Python实现多线程/多进程的TCP服务器
Sep 03 Python
基于pycharm 项目和项目文件命名规则的介绍
Jan 15 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的分页功能
2007/03/21 PHP
PHP memcache扩展的三种安装方法
2009/04/26 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
PHP命名空间与自动加载类详解
2018/09/04 PHP
thinkphp5使html5实现动态跳转的例子
2019/10/16 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
2015/03/26 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
5分钟快速掌握JS中var、let和const的异同
2018/09/19 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
Python中实现三目运算的方法
2015/06/21 Python
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
如何在python中写hive脚本
2019/11/08 Python
python实现程序重启和系统重启方式
2020/04/16 Python
python 多线程中join()的作用
2020/10/29 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
班级光棍节联谊会策划书
2014/10/10 职场文书
校运会新闻稿
2015/07/17 职场文书
nginx 配置指令之location使用详解
2022/05/25 Servers