解读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自动化工具日志查询分析脚本代码实现
Nov 26 Python
在Python中操作字典之update()方法的使用
May 22 Python
简单的python后台管理程序
Apr 13 Python
Python实现的手机号归属地相关信息查询功能示例
Jun 08 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
Nov 29 Python
pyqt5 实现工具栏文字图片同时显示
Jun 13 Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 Python
Python爬取豆瓣视频信息代码实例
Nov 16 Python
python重要函数eval多种用法解析
Jan 14 Python
Django 5种类型Session使用方法解析
Apr 29 Python
keras .h5转移动端的.tflite文件实现方式
May 25 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
Mar 03 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源码之将图片转化为data/base64数据流实例详解
2016/11/27 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
Ext.MessageBox工具类简介
2009/12/10 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
jquery对dom的操作常用方法整理
2013/06/25 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
2015/06/06 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
Nodejs进阶:基于express+multer的文件上传实例
2016/11/21 NodeJs
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
python实现ID3决策树算法
2018/08/29 Python
python 字符串常用函数详解
2019/09/11 Python
零基础小白多久能学会python
2020/06/22 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
企业总经理助理岗位职责
2014/09/12 职场文书
党员证明模板
2015/06/19 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python