解读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调用cmd命令行制作刷博器
Jan 13 Python
Python中多线程及程序锁浅析
Jan 21 Python
使用Python编写简单的端口扫描器的实例分享
Dec 18 Python
Python实现登录接口的示例代码
Jul 21 Python
python实现基于SVM手写数字识别功能
May 27 Python
python保存数据到本地文件的方法
Jun 23 Python
python实现汉诺塔算法
Mar 01 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
May 13 Python
python爬虫基础知识点整理
Jun 02 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 Python
Keras SGD 随机梯度下降优化器参数设置方式
Jun 19 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
php程序总是提示验证码输入有误解决方案
2015/01/07 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
php获取图片信息的方法详解
2015/12/10 PHP
PHP实现生成带背景的图形验证码功能
2016/10/03 PHP
jquery prop的使用介绍及与attr的区别
2013/12/19 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
JavaScript格式化json和xml的方法示例
2019/01/22 Javascript
在微信小程序中保存网络图片
2019/02/12 Javascript
ES6中Promise的使用方法实例总结
2020/02/18 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
2020/07/19 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
python3图片转换二进制存入mysql
2013/12/06 Python
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
Python本地与全局命名空间用法实例
2015/06/16 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
日本钓鱼渔具和户外用品网上商店:naturum
2016/08/07 全球购物
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
澳大利亚领先的运动鞋商店:Hype DC
2018/03/31 全球购物
幼儿教师考核制度
2014/01/25 职场文书
教学器材管理制度
2014/01/26 职场文书
机械机修工岗位职责
2014/08/03 职场文书
个人买房协议书范本
2014/10/06 职场文书
Python自动化测试PO模型封装过程详解
2021/06/22 Python