参考:https://blog.csdn.net/weixin_42134789/article/details/81283167
https://blog.csdn.net/weixin_42134789/article/details/81283167
https://docs.djangoproject.com/zh-hans/3.2/topics/cache/#django.views.decorators.cache.cache_page
https://www.cnblogs.com/sss4/p/7563423.html
https://www.cnblogs.com/sui776265233/p/9900954.html
作为python的主流web框架,当你疑惑它是否能像java那也支持高并发的时候,有一个疑惑肯定会产生,django是否支持缓存?
答案是肯定的!
Django 自带强大的缓存系统,可以让你保存动态页面,这样就不必为每次请求计算。为了方便,Django 提供了不同级别的缓存粒度。你可以缓存特定视图的输出,你可以只缓存难以生成的部分,或者你可以缓存整个网站。
一、设置缓存
1.1.数据库缓存
Django 可以在数据库中存储缓存数据。如果你有一个快速、索引正常的数据库服务器,这种缓存效果最好。
用数据库表作为你的缓存后端:
- 将
BACKEND
设置为django.core.cache.backends.db.DatabaseCache
- 将
LOCATION
设置为数据库表的tablename
。这个表名可以是没有使用过的任何符合要求的名称。
在这个例子中,缓存表的名称是 my_cache_table
:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', } }
1.2.创建缓存表
使用数据库缓存之前,必须通过下面的命令创建缓存表:
python manage.py createcachetable
2.1.文件系统缓存
基于文件的后端序列化并保存每个缓存值作为单独的文件。要使用此后端,可将 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', } }
3.1.本地内存缓存
如果你的配置文件中没有指定其他缓存,那么这是默认的缓存。如果你想获得内存缓存的速度优势,但又不具备运行 Memcached 的能力,可以考虑使用本地内存缓存后端。这个缓存是每进程所有(见下文)和线程安全的。要使用它,可以将 BACKEND
设置为 "django.core.cache.backends.locmem.LocMemCache"
。例如:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
}
}
LOCATION
被用于标识各个内存存储。如果只有一个 locmem
缓存,你可以忽略 LOCATION
。但是如果你有多个本地内存缓存,那么你至少要为其中一个起个名字,以便将它们区分开。
这种缓存使用最近最少使用(LRU)的淘汰策略。
请注意,每个进程都会有自己的私有缓存实例,这意味着不可能进行跨进程缓存。这也意味着本地内存缓存的内存效率不是特别高,所以对于生产环境来说,它可能不是一个好的选择。对于开发来说是不错的选择。
这将在数据库中创建一个表,该表的格式与 Django 数据库缓存系统期望的一致。该表的表名取自 LOCATION
二、缓存参数
每个缓存后端可以通过额外的参数来控制缓存行为。这些参数在 CACHES
配置中作为附加键提供。有效参数如下:
-
TIMEOUT
:缓存的默认超时时间,以秒为单位。这个参数默认为300
秒(5 分钟)。你可以将TIMEOUT
设置为None
,这样,默认情况下,缓存键永远不会过期。值为0
会导致键立即过期(实际上是 “不缓存”)。 -
OPTIONS
:任何应该传递给缓存后端的选项。有效的选项列表会随着每个后端而变化,由第三方库支持的缓存后端会直接将其选项传递给底层缓存库。实施自有缓存策略的缓存后端(即
locmem
、filesystem
和database
后端)将尊重以下选项:-
MAX_ENTRIES
:删除旧值之前允许缓存的最大条目。默认是300
。 -
CULL_FREQUENCY
:当达到MAX_ENTRIES
时,被删除的条目的比例。实际比例是1 / CULL_FREQUENCY
,所以将CULL_FREQUENCY
设置为2
,即当达到MAX_ENTRIES
时将删除一半的条目。这个参数应该是一个整数,默认为3
。CULL_FREQUENCY
的值为0
意味着当达到MAX_ENTRIES
时,整个缓存将被转储。在某些后端(特别是database
),这使得缓存速度 更 快,但代价是缓存未命中更多。
Memcached 后端将
OPTIONS
的内容作为关键字参数传递给客户端构造函数,允许对客户端行为进行更高级的控制。具体用法请看下文。 -
-
KEY_PREFIX
。一个自动包含在 Django 服务器使用的所有缓存键中的字符串(默认为前缀)。查看 缓存文档 获取更多信息。
-
VERSION
:Django 服务器生成的缓存键的默认版本号。查看 缓存文档 获取更多信息。
-
KEY_FUNCTION
一个字符串,包含一个函数的点分隔路径,该函数定义了如何将前缀、版本和键组成一个最终的缓存键。查看 缓存文档 获取更多信息。
在本例中,正在配置一个文件系统后端,超时为 60 秒,最大容量 1000 项:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', 'TIMEOUT': 60, 'OPTIONS': { 'MAX_ENTRIES': 1000 } } }
三、视图缓存¶
django.views.decorators.cache.cache_page()
使用缓存框架的通用办法是缓存视图结果。django.views.decorators.cache
定义了一个 cache_page
装饰器,它将自动缓存视图的响应:
from django.views.decorators.cache import cache_page @cache_page(60 * 15) def my_view(request): ...
cache_page
使用了一个单独的参数:缓存过期时间,以秒为单位。在上面的例子里,my_view()
视图的结果将缓存15分钟。(注意,我们用 60 * 15
这样的方式编写,目的是方便阅读。 60 * 15
将计算为 900
,也就是15分钟乘以每分钟60秒。)
cache_page
设置的缓存超时优先于 Cache-Control
头中的 ``max-age'' 指令。
和缓存站点一样,对视图缓存,以 URL 为键。如果许多 URL 指向相同的视图,每个 URL 将被单独缓存。继续以 my_view
为例,如果你的 URLconf 是这样的:
urlpatterns = [ path('foo/<int:code>/', my_view), ]
那么 /foo/1/
和 /foo/23/
的请求将被分别缓存,正如你所料。但一旦部分 URL (比如 /foo/23/
)已经被请求,那么随后的请求都将使用缓存。
cache_page
也可以传递可选关键字参数 cache
,它指引装饰器在缓存视图结果时使用特定的缓存(来自 CACHES
设置)。默认情况下,将使用默认缓存,但你可以指定任何你想要的缓存:
@cache_page(60 * 15, cache="special_cache") def my_view(request): ...
你可以基于每个视图覆盖缓存前缀。cache_page
传递了一个可选关键字参数 key_prefix
,它的工作方式与中间件的 CACHE_MIDDLEWARE_KEY_PREFIX
相同。可以这样使用它:
@cache_page(60 * 15, key_prefix="site1") def my_view(request): ...
key_prefix
和 cache
参数可能需要被一起指定。key_prefix
参数和 CACHES
下指定的 KEY_PREFIX
将被连接起来。
此外, cache_page
在响应中自动设置 Cache-Control
和 Expires
头, 这会影响 下游缓存.