【Django】缓存

寿毅庵
2023-12-01

1 缓存配置

1.1 将缓存的数据存储到您的数据库中:

说明:尽管存储介质没有更换,但是当把一次负责查询的结果直接存储到表里,比如多个条件的过滤查询结果,可避免重复进行复杂查询,提升效率。

配置:

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的缓存数据
        }
    }

1.2 将数据缓存到服务器内存中:

如果你的配置文件中没有指定其他缓存,那么这是默认的缓存。如果你想获得内存缓存的速度优势,但又不具备运行 Memcached 的能力,可以考虑使用本地内存缓存后端。这个缓存是每进程所有(见下文)和线程安全的。要使用它,可以将 BACKEND 设置为
“django.core.cache.backends.locmem.LocMemCache”。例如:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake',
    }
}

1.3 文件系统缓存

基于文件的后端序列化并保存每个缓存值作为单独的文件。要使用此后端,可将 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',
    }
}

2 使用缓存方式

2.1 在视图函数中

from django.views.decorators.cache import cache_page

@cache_page(30) ->单位s
def my_view(request):
	...

2.2 在路由中

from django.views.decorators.cache import cache_page

urlpatterns=[
	path=('foo/',cache_page(60)(my_view)),
]

3 局部缓存

缓存api的使用

3.1 先引入cache对象

方式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’]

3.2 基本接口

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() 将删除缓存里的 任何 键,不只是你应用里设置的那些键。

4. 浏览器缓存

浏览器缓存(Browser Caching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览。
浏览器缓存主要有两类:
缓存协商:Last-modified ,Etag
彻底缓存:cache-control,Expires

缓存协商的意思是需要去服务器端询问页面有没有修改过,没有修改过则返回304直接使用缓存内容,否则返回新内容。

协商步骤:

  1. 服务器发送带Last-modified:GMTtime 头的http response
  2. 浏览器下次请求时带上if-modified-since:GMTtime http 请求头
  3. 服务端用本地Last-modified时间与if-modified-since比较,计算浏览器数据是否过期并发送响应

Etag的工作原理与Last-modified类似,不同点在于Etag的值是用户可自定义的。

彻底缓存的意思是在缓存失效之前不再需要跟服务器交互,常用的是Expires,Expires的值是一个绝对时间,由服务器产生。

这儿存在一个问题,就是服务器的时间可能给客户端的时间不一致导致缓存时间的偏差。
要解决这个问题就要使用cache-control,它保存的是一个相对浏览器的时间
如果同时存在cache-control和Expires怎么办呢?
浏览器总是优先使用cache-control,如果没有cache-control才考虑Expires

 类似资料: