解读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映射列表实例分析
Jan 26 Python
使用Python脚本将文字转换为图片的实例分享
Aug 29 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
Python骚操作之动态定义函数
Mar 26 Python
Python GUI编程 文本弹窗的实例
Jun 11 Python
Gauss-Seidel迭代算法的Python实现详解
Jun 29 Python
利用ImageAI库只需几行python代码实现目标检测
Aug 09 Python
PyTorch的torch.cat用法
Jun 28 Python
Windows 平台做 Python 开发的最佳组合(推荐)
Jul 27 Python
python 怎样进行内存管理
Nov 10 Python
Django debug为True时,css加载失败的解决方案
Apr 24 Python
4种方法python批量修改替换列表中元素
Apr 07 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获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
基于jquery的商品展示放大镜
2010/08/07 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
详解JavaScript的策略模式编程
2015/06/24 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
JavaScript实现256色转灰度图
2017/02/22 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
layer插件select选中默认值的方法
2018/08/14 Javascript
微信小程序自定义音乐进度条的实例代码
2018/08/28 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
详解如何为你的angular app构建一个第三方库
2018/12/07 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
微信小程序仿今日头条导航栏滚动解析
2019/08/20 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
python 将字符串转换成字典dict
2013/03/24 Python
Python中optparse模块使用浅析
2015/01/01 Python
python re模块findall()函数实例解析
2018/01/19 Python
用Python编写一个高效的端口扫描器的方法
2018/12/20 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
python函数的万能参数传参详解
2019/07/26 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
HTML5里的placeholder属性使用实例和美化显示效果的方法
2014/04/23 HTML / CSS
舞出我人生观后感
2015/06/16 职场文书
小学体育组工作总结
2015/08/13 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
4种非常实用的python内置数据结构
2021/04/28 Python
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android