系统讲解Django开发的基础知识, 高级知识。关注公众号[薯条编程],领取该教程的PDF电子书:《Python web开发-Django从入门到项目实战》。
12.2.1 更细粒度的缓存控制
使用django的缓存框架,可以对站点,视图进行缓存,这些都是页面级别的缓存。在某些情况下,对整个页面进行缓存并不是最佳的方法。比如页面的一部分内容需要经常更新,此时如果对整个页面进行缓存,会减弱内容的实时性,影响用户体验。
缓存的使用原则,只需对很少变化的静态数据进行缓存。
只对模板中的部分内容进行缓存,可以解决这样的问题。django同时提供了一套底层的Cache API,可以对缓存进行更细粒度的控制,将应用中的Python数据对象单独缓存。
12.2.2 Cache API的基本用法
在django.core.cache中提供了一个类似字典类型的caches对象,通过caches对象可以访问在settings.py中的配置的缓存实例。根据CACHES中的缓存别名来获取缓存实例:
>>> from django.core.cache import caches
>>> cache = caches['myalias']
>>> default_cache = caches['default']
caches返回的是一个线程安全的缓存实例,如果缓存别名对应的缓存实例不存在,django会抛出一个InvalidCacheBackendError的错误异常。django同时提供了访问默认缓存实例的快捷方式:
from django.core.cache import cache
等价于:
>>> from django.core.cache import caches
>>> cache = caches['default']
cache对象的操作方法:
(1) 设置缓存对象
1.cache.set(key, value,timeout=DEFAULT_TIMEOUT,version=None)
参数:
key是一个字符串类型,表示缓存对象的键名。
value是一个可列化的任意python对象,表示缓存对象的值。
timeout表示缓存的有效期,默认为在CACHES中配置的有效期。
version表示缓存对象对应的版本号。
描述:
设置缓存对象的值、过期时间、版本号,无返回值。
代码实例:
>>> cache.set('user', 'Backer')
2.cache.add(key, value,timeout=DEFAULT_TIMEOUT,version=None)
参数:
同cache.set方法
描述:
当缓存对象不存在时才调用该方法。
如果缓存对象已存在,该方法不会去更新缓存对象的值。
add方法的返回值为布尔类型,如果为True表示已经将结果进行缓存,否则表示未缓存。
代码实例:
>>> cache.add('user', 'Lohan')
False
>>> cache.add('uid', 1314)
True
3.cache.touch(key, timeout=DEFAULT_TIMEOUT,version=None)
参数:
同cache.set方法
描述:
为缓存对象设置一个新的过期时间,返回布尔类型,True表示设置成功,False表示设置失败。
代码实例:
>>> cache.touch('user', 60)
True
4.cache.get_or_set(key, value,timeout=DEFAULT_TIMEOUT,version=None)
参数:
同cache.set方法
描述:
如果缓存对象不存在则会创建一个新的缓存对象,如果缓存对象已存在,则会更新该缓存对象的值。该方法返回缓存对象的值。
代码实例:
>>> cache.get_or_set('user', 'Lohan')
'Lohan'
5.cache.set_many(dict,timeout)
参数:
dict:字典类型,键名表示缓存对象的键名。
timeout:缓存对象的有效期,单位为秒
描述:
批量设置缓存对象。
代码实例:
>>> cache.set_many({'a': 1, 'b': 2, 'c': 3})
(2) 读取缓存对象
1.cache.get(key, default=None,version=None)
参数:
同cache.set方法
描述:
获取缓存对象的值。
代码实例:
>>> cache.get('user')
'Lohan'
2.cache.get_many(keys, version=None)
参数:
keys:是一个可迭代对象(列表,元组,字典),对象中的元素表示缓存对象的键名。
version:缓存对象的版本号。
描述:
批量获取缓存对象的值。
代码实例:
>>> values = cache.get_many({'a','b'})
>>> value
{'b': 2, 'a': 1}
(3) 删除缓存对象
1.cache.delete_many(keys, version=None)
参数:
同cache.get_many方法
描述:
批量删除缓存对象。
代码实例:
>>> cache.delete_many({'a','b'})
2.cache.clear()
描述:
清空项目中的所有缓存,需谨慎使用。
代码实例:
>>> cache.clear()
(4) 自增与自减
1.cache.incr(key, delta=1, version=None)
参数:
key:缓存对象的键名
delta:表示增量值
version:缓存对象的版本号
描述:
对缓存对象的值进行自增,返回自增后的值
代码实例:
>>> cache.set('count', 1)
>>> cache.incr('count', 3)
4
2.cache.decr(key, delta=1, version=None)
参数:
同cache.incr方法。
描述:
对缓存对象的值进行自减,返回自减后的值
代码实例:
>>> cache.set('count', 1)
>>> cache.decr('count', 3)
-2
(5) 自缓存对象的版本号
在设置缓存对象时,通过添加一个版本号,可以对缓存对象进行版本控制。
代码实例:
>>> cache.set('username', 'Lohan', version=2)
>>> cache.get('username')
None
在上文代码中,创建了一个键名为my_key的缓存对象,并且设置的版本号为2。由于执行get方法时未指定版本号,所以获取到的值为None。对缓存对象添加版本号,可以对不同阶段的缓存对象进行版本控制,在访问缓存对象时,必须指定正确的版本号:
>>> cache.get('username',version=2)
LOhan
django同时提供了两个便捷的方法来对缓存对象的版本号进行自增与自减:
1.cache.incr_version(key, delta=1, version=None)
2.cache.decr_version(key, delta=1, version=None)
代码实例:
>>> cache.decr_version('username', version=3)
2
>>> cache.incr_version('username', version=2)
3
>>> cache.decr_version('username', version=3)
2
关注微信公众号:薯条编程,公众号后台回复"Python资料",免费领取Python电子书,以及学习Python视频课程。
小班授课,薯条老师一对一教学,火热报名中,点击了解线下就业培训。