
Django 建立的是动态网站,一般情况,每个请求都会经过这样一个过程:
实际开发中会遇到热点数据出现大量实质相同的请求,假如每次请求都要经过上面的过程,将会出现大量重复的请求,这不仅对用户体验不好,而且对数据库的读写压力会非常大,容易把数据库干死掉。
那么怎么解决这个问题呢?方法很多,比如缓存。
缓存的思路是:已经处理过一次并得到结果,就把这个结果存储起来,再有请求时,优先从缓存中取结果返回。
可见,缓存对于一个高性能、追求用户体验的网站来说是多么重要。
Django 中的缓存系统
1、Memcached
Memcached 是 Django 原生支持的缓存系统,速度快,效率高,它是一种基于内存的缓存服务。
在 settings 文件中设置,
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
Memcached 支持分布式服务,可以同时在几台机器上运行,只要将 IP 加入到 LOCATION 中。
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'172.19.26.240:11211',
'172.19.26.242:11212',
'172.19.26.244:11213',
]
}
}
基于内存的缓存系统容易丢失数据。
2、数据库缓存
开篇介绍的时候就说过,俺们使用缓存的目的就是减轻数据库的读写压力,如果缓存也用数据库,有点不合适。不合适归不合适,人家支持了就了解下。
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'my_cache_table',
}
}
LOCATION 为 tablename(缓存表的名称)
在使用数据库缓存之前,必须使用以下命令创建缓存表:
python manage.py createcachetable
该命令会在数据库中创建一个表,该表的格式与 Django 的数据库缓存系统期望的格式相同。 该表的名称取自 LOCATION。 如果使用多个数据库缓存,则要为每个数据库都创建缓存表。 如果使用多个数据库缓存,createcachetable 遵循 allow_migrate()数据库路由器的方法。
3、文件缓存
文件缓存比数据库缓存慢。
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache',
}
}
4、本地缓存
如果你本地主机内存够大够快,也可以直接使用它作为缓存,并且这也是 Django 默认使用的缓存系统。
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
}
}
LOCATION 被用于标识各个内存存储位置。如果只有一个 locmem 缓存,你可以忽略 LOCATION 。但是如果你有多个本地内存缓存,那么你至少要为其中一个起个名字,以便将它们区分开。
注意,每个进程将有它们自己的私有缓存实例,这意味着不存在跨进程的缓存。这也意味着本地内存缓存不是特别节省内存,因此它不适合生产环境,不过它在开发环境中表现很好。
5、虚拟缓存(用于开发)
当你的生产环境是个大型的缓存系统,而你在开发的时候又没有相应的缓存系统支持,或者不想用那种笨重的第三方组件进行开发。但实际开发过程中,你又不得不接入缓存系统,这种情况下,开发用的缓存就很顺手了。
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
}
}
6、自定义缓存
实际开发中,用的最多的就是使用 drf 的扩展包 drf-extensions + redis 来实现。
在虚拟环境中安装:
pip install drf-extensions
pip install django-redis
settings 文件配置:
# drf缓存过期时间设置
REST_FRAMEWORK_EXTENSIONS = {
'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60 * 60
}
# 配置redis 缓存
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://:password@127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
如果你使用的 Django 版本是 3.0 以上,需要修改以下这个文件:
# 文件位置
D:\Envs\example_project\Lib\site-packages\rest_framework_extensions\key_constructor\bits.py
D:\Envs\example_project 为你自己项目的虚拟环境。
打开文件,做如下修改:
from django.db.models.sql.datastructures import EmptyResultSet
改为
from django.core.exceptions import EmptyResultSet
drf-extensions 对缓存提供了3个扩展类:
from rest_framework_extensions.cache.mixins import CacheResponseMixin, ListCacheResponseMixin, RetrieveCacheResponseMixin
CacheResponseMixin:支持 List 和 Retrieve 两种缓存,与 ListModelMixin 和 RetrieveModelMixin 一起配合使用 ListCacheResponseMixin:用于缓存 List 的视图数据,与 ListModelMixin 配合使用。 RetrieveCacheResponseMixin:用于缓存返回单一数据的视图,与 RetrieveModelMixin 配合使用。




