解读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 02 Python
分享python数据统计的一些小技巧
Jul 21 Python
Python中分支语句与循环语句实例详解
Sep 13 Python
pycharm运行出现ImportError:No module named的解决方法
Oct 13 Python
PyQt5 实现给窗口设置背景图片的方法
Jun 13 Python
Python3.7安装keras和TensorFlow的教程图解
Jun 18 Python
python将三维数组展开成二维数组的实现
Nov 30 Python
python模拟实现斗地主发牌
Jan 07 Python
python属于解释语言吗
Jun 11 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
Python偏函数实现原理及应用
Nov 20 Python
详解解决jupyter不能使用pytorch的问题
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 使用curl提交json格式数据
2013/06/29 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
PDO::beginTransaction讲解
2019/01/27 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
2010/12/28 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
2021/02/07 Vue.js
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
Python open()文件处理使用介绍
2014/11/30 Python
Python新手入门最容易犯的错误总结
2017/04/24 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
Python数据持久化shelve模块用法分析
2018/06/29 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
浅述python2与python3的简单区别
2018/09/19 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
Python编译成.so文件进行加密后调用的实现
2019/12/23 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
代码中finally中的代码会不会执行
2012/02/06 面试题
岗位廉洁从业承诺书
2014/03/28 职场文书
《悯农》教学反思
2014/04/28 职场文书
文明之星事迹材料
2014/05/09 职场文书
文秘专业应届生求职信
2014/05/26 职场文书
超市理货员岗位职责
2014/07/04 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
Python中相见恨晚的技巧
2021/04/13 Python
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript