说明:尽管存储介质没有更换,但是当把一次负责查询的结果直接存储到表里,比如多个条件的过滤查询结果,可避免重复进行复杂查询,提升效率。
配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table',
'TIMEOUT': 300, # 缓存保存时间300s
'OPTIONS': {
'MAX_ENTRIES': 300, # 缓存最大数据条数
'CULL_FREQUENCY': 2 # 缓存条数达到最大值时,删除1/X的缓存数据
}
}
如果你的配置文件中没有指定其他缓存,那么这是默认的缓存。如果你想获得内存缓存的速度优势,但又不具备运行 Memcached 的能力,可以考虑使用本地内存缓存后端。这个缓存是每进程所有(见下文)和线程安全的。要使用它,可以将 BACKEND 设置为
“django.core.cache.backends.locmem.LocMemCache”。例如:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
}
}
基于文件的后端序列化并保存每个缓存值作为单独的文件。要使用此后端,可将 BACKEND 设置为 “django.core.cache.backends.filebased.FileBasedCache” 并将 LOCATION 设置为一个合适的路径。比如,在 /var/tmp/django_cache 存储缓存数据,使用以下配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache',
}
}
from django.views.decorators.cache import cache_page
@cache_page(30) ->单位s
def my_view(request):
...
from django.views.decorators.cache import cache_page
urlpatterns=[
path=('foo/',cache_page(60)(my_view)),
]
缓存api的使用
方式1:使用caches[‘CACHE配置的key’]导入具体对象
from django.core.cache import caches
cache1 = caches['default']
如果键名不存在,将会引发 InvalidCacheBackendError 错误。
方式2:
作为快捷方式,默认缓存可以通过 django.core.cache.cache 引用:
>>> from django.core.cache import cache
这个对象等价于 caches[‘default’]
1.cache.set(key, value, timeout=DEFAULT_TIMEOUT, version=None)
cache.set('my_key', 'hello, world!', 30)
2.cache.get(key, default=None, version=None)
>>> cache.get('my_key')
'hello, world!'
如果对象不在缓存中,cache.get() 将返回 None。
3.cache.add(key, value, timeout=DEFAULT_TIMEOUT, version=None)
4.cache.get_or_set(key, default, timeout=DEFAULT_TIMEOUT, version=None)
5.cache.get_many(keys, version=None)
>>> cache.set('a', 1)
>>> cache.set('b', 2)
>>> cache.set('c', 3)
>>> cache.get_many(['a', 'b', 'c'])
{'a': 1, 'b': 2, 'c': 3}
6.cache.set_many(dict, timeout)
>>> cache.set_many({'a': 1, 'b': 2, 'c': 3})
>>> cache.get_many(['a', 'b', 'c'])
{'a': 1, 'b': 2, 'c': 3}
类似 cache.set(),set_many() 带有一个可选的 timeout 参数。
7.你可以使用 delete() 显示地删除键,以清空特定对象的缓存:
>>> cache.delete('a')
True
8.cache.delete_many(keys, version=None)
9.cache.clear()
最后,如果你想删除缓存里的所有键,使用 cache.clear()。注意,clear() 将删除缓存里的 任何 键,不只是你应用里设置的那些键。
浏览器缓存(Browser Caching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览。
浏览器缓存主要有两类:
缓存协商:Last-modified ,Etag
彻底缓存:cache-control,Expires
缓存协商的意思是需要去服务器端询问页面有没有修改过,没有修改过则返回304直接使用缓存内容,否则返回新内容。
协商步骤:
Etag的工作原理与Last-modified类似,不同点在于Etag的值是用户可自定义的。
彻底缓存的意思是在缓存失效之前不再需要跟服务器交互,常用的是Expires,Expires的值是一个绝对时间,由服务器产生。
这儿存在一个问题,就是服务器的时间可能给客户端的时间不一致导致缓存时间的偏差。
要解决这个问题就要使用cache-control,它保存的是一个相对浏览器的时间
如果同时存在cache-control和Expires怎么办呢?
浏览器总是优先使用cache-control,如果没有cache-control才考虑Expires