Django缓存

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,若某个时间内再次发生同一个请求,则不再去执行请求响应过程,而直接从内存或高速缓存系统中获取该请求的响应内容返回给用户。

Django提供了5种不同的缓存方式:

  • Memcached:高性能的分布式内存对象缓存系统,用于动态网站,以减轻数据库负载。使用Memcache需要安装系统服务器,适合超大型网站使用。

  • 数据库缓存:缓存信息存储在网站数据库的缓存表中,缓存表可以在项目的配置文件中配置,适合大中型网站使用。

  • 文件系统缓存:缓存信息以文本文件格式保存,适合中小型网站使用。

  • 本地内存缓存:Django默认的缓存保存方式,只适用于项目开发测试。

  • 虚拟缓存:Django内置的虚拟缓存,实际上只提供缓存接口,并不能储存缓存数据,只用于开发测试。

缓存可以用在四个地方:全站缓存、路由缓存、视图缓存、模板缓存

缓存配置

数据库缓存

python 复制代码
#BACKEND用于配置缓存引擎,LOCATION用于数据表的命名
CACHES = {
    'default':{
		# 配置缓存引擎        
        'BACKEND':'django.core.cache.backends.db.DatabaseCache',
        # 数据表的命名
        'LOCATION':'my_cache_table',
        #设置缓存期限,以秒为单位,若为None,则永不过期
        'TIMEOUT':60,
        'OPTIONS':{
        #代表最大缓存记录数量
        'MAX_ENTRIES': 1000,
        #当缓存达到最大数量后,剔除缓存的数量
        'CULL_FREOUENCY':3
}
    }
}
#缓存数据表的生成依赖于配置文件中DATABASES的配置信息,如果DATABASES配置了多个数据库,那么缓存数据表默认在DATABASES 的default的数据库中生成
#创建数据表
python manage.py createcachetable

文件缓存

文件系统缓存将缓存数据以文本文件的形式存储在服务器的文件系统上。

python 复制代码
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': '/path/to/your/cache/directory',  # 指定缓存文件存放的目录
    }
}

本地缓存

默认情况下,Django已经配置好了本地内存缓存:

python 复制代码
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}

虚拟缓存

Django的虚拟缓存实际上不执行任何缓存操作,仅提供一个缓存接口,用于开发和测试阶段,确保缓存逻辑正确,而无需实际缓存数据。

python 复制代码
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
    }
}

缓存的使用

全站缓存

启用Django的缓存中间件来实现全站缓存。在MIDDLEWARE设置中添加django.middleware.cache.UpdateCacheMiddlewaredjango.middleware.cache.FetchFromCacheMiddleware,确保它们的顺序正确,一般位于其他中间件的起始和末尾:

python 复制代码
MIDDLEWARE = [
    # ...
    'django.middleware.cache.UpdateCacheMiddleware',  # 应放在其他中间件之前
    # 其他中间件...
    'django.middleware.cache.FetchFromCacheMiddleware',  # 应放在其他中间件之后
]
#设置缓存生命周期
CACHE_MIDDLEWARE_SECONDS = 15
#属性值来自缓存配置CACHES的default
#
CACHE_MIDDLEWARE_ALIAS = 'default'
#设置缓存cache_key字段
#用同一个Django项目多个站点之间共享缓存
CACHE_MIDDLEWARE_KEY_PREFIX = 'MyDjango'

CACHE_MIDDLEWARE_SECONDS 设置缓存的生命周期。若在视图、路由和模板中使用缓存并设置生命周期属性 TIMEOUT,则优先选择CACHE_MIDDLEWARE_SECONDS。

CACHE_MIDDLEWARE_ALIAS 设置缓存的保存路径,默认为default。如果缓存配置CACHES中设置多种缓存方式,没有设置缓存的保存路径,就默认保存在缓存配置CACHES的 default 的配置信息中。

CACHE_MIDDLEWARE_KEY_PREFIX指定某个Django站点的名称。在一些大型网站中都会采用分布式站点实现负载均衡,这是将同一个Django项目部署在多个服务器上,当网站访问量过大的时候,可以将访问量分散到各个服务器,提高网站的整体性能。如果多个服务器使用共享缓存,那么该属性是为了区分各个服务器的缓存数据,这样每个服务器只能使用自己的缓存数据。

具体的表名以配置为准,下图只是展示例子

视图缓存

python 复制代码
from django.shortcuts import render
from django.views.decorators.cache import cache_page
# cache与全站缓存CACHE_MIDDLEWARE_ALIAS相同
# key_prefix与全站缓存CACHE_MIDDLEWARE_KEY_PREFIX相同
@cache_page(10, cache='default', key_prefix='myview')
def index(request):
    return render(request,"index.html")
#缓存方法
from django.core.cache import cache
 # 将数据添加到缓存中,如果键已存在,则不进行任何操作默认只缓存5分钟
    cache.add(key, value)
 # 尝试从缓存中获取键的值
    value = cache.get(key)
 # 从缓存中删除指定的键
    cache.delete(key)
 # 清空所有缓存
    cache.clear()

具体的表名以配置为准,下图只是展示例子

路由缓存

python 复制代码
urlpatterns = [
    # 将'my_view'视图的输出缓存60秒
    path('my_view/', cache_page(60,cache='MyDjango',key_prefix='MyURL')(views.my_view), name='my_view'),
    # 其他URL配置...
]

具体的表名以配置为准,下图只是展示例子

相关推荐
linjoe9920 小时前
【Medical AI\pathology】WSI 的 JPEG 压缩质量与存储效率权衡分析
python·图像压缩·计算病理学·wsi
Fightting8820 小时前
Tkinter Button bind hover message
开发语言·python
shuair20 小时前
redis缓存预热、缓存击穿、缓存穿透、缓存雪崩
redis·spring·缓存
玄同76520 小时前
LangChain 1.0 模型接口:多厂商集成与统一调用
开发语言·人工智能·python·langchain·知识图谱·rag·智能体
喵手21 小时前
Python爬虫实战:构建招聘会数据采集系统 - requests+lxml 实战企业名单爬取与智能分析!
爬虫·python·爬虫实战·requests·lxml·零基础python爬虫教学·招聘会数据采集
专注VB编程开发20年21 小时前
python图片验证码识别selenium爬虫--超级鹰实现自动登录,滑块,点击
数据库·python·mysql
iFeng的小屋21 小时前
【2026最新当当网爬虫分享】用Python爬取千本日本相关图书,自动分析价格分布!
开发语言·爬虫·python
上架ipa21 小时前
redis图形化客户端功能对比
redis·缓存
民乐团扒谱机21 小时前
【微科普】3D 演奏蠕虫分析图:解码音乐表演情感的 “可视化语言”
python·可视化·音乐·3d图·3d蠕虫
芝士爱知识a21 小时前
AlphaGBM 深度解析:下一代基于 AI 与蒙特卡洛的智能期权分析平台
数据结构·人工智能·python·股票·alphagbm·ai 驱动的智能期权分析·期权