Django之缓存

文章目录

一、什么是缓存

简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中

  • 当用户再次请求时,直接去缓存中拿,避免对数据库的频繁操作,加快数据的显示时间
  • 需要知道的是,缓存里面的数据一般都设置有超时时间,缓存一般用在数据变化不大,实时率不高的情况下。

由于Django是动态网站,所有每次请求均会去数据进行相应的操作

  • 当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存
  • 缓存将一个某个views的返回值保存至内存或者memcache中
    • 5分钟内(默认配置)再有人来访问时,则不再去执行view中的操作
    • 而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

二、Django中的6种缓存方式

  • 内存缓存
  • 文件缓存
  • 数据库缓存
  • Memcache缓存(使用python-memcached模块)
  • Memcache缓存(使用pylibmc模块)
  • redis缓存

经常使用到的有文件缓存以及redis缓存


三、Django缓存的配置

这里就只写文件缓存、内存缓存和数据库缓存配置了,其他想要了解可以自行查找

内存缓存(默认情况下就是缓存到内存中)

settings.py配置文件中

python 复制代码
	CACHES = {
	 'default': {
	  'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 指定缓存使用的引擎
	  'LOCATION': 'unique-snowflake',         # 写在内存中的变量的唯一值 
	  'TIMEOUT':300,             # 缓存超时时间(默认为300秒,None表示永不过期)
	  'OPTIONS':{
	   'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
	   'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
	  }  
	 }
	}

文件缓存(把缓存数据存储在文件中)

settings.py配置文件中

python 复制代码
	CACHES = {
	 'default': {
	  'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定缓存使用的引擎
	  'LOCATION': '/var/tmp/django_cache',        #指定缓存的路径
	  'TIMEOUT':300,              #缓存超时时间(默认为300秒,None表示永不过期)
	  'OPTIONS':{
	   'MAX_ENTRIES': 300,            # 最大缓存记录的数量(默认300)
	   'CULL_FREQUENCY': 3,           # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
	  }
	 }   
	}

数据库缓存(把缓存数据存储在数据库中)

settings.py配置文件中

python 复制代码
	CACHES = {
	 'default': {
	  'BACKEND': 'django.core.cache.backends.db.DatabaseCache',  # 指定缓存使用的引擎
	  'LOCATION': 'cache_table',          # 数据库表    
	  'OPTIONS':{
	   'MAX_ENTRIES': 300,           # 最大缓存记录的数量(默认300)
	   'CULL_FREQUENCY': 3,          # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
	  }  
	 }   
	}

注意,创建缓存的数据库表使用的语句:

python 复制代码
	python manage.py createcachetable

四、Django中的缓存应用(三种粒度)

全站缓存(利用Django中间件)

既然是全站缓存,当然要使用Django中的中间件

用户的请求通过中间件,经过一系列的认证等操作,如果请求的内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户。当返回给用户之前,判断缓存中是否已经存在,如果不存在,则UpdateCacheMiddleware会将缓存保存至Django的缓存之中,以实现全站缓存

python 复制代码
	缓存整个站点,是最简单的缓存方法
	需要在settings配置文件中的中间件中加入 "update(放在最前面)" 和 "fetch(放在最后面)" 中间件
	MIDDLEWARE = [
	    'django.middleware.cache.UpdateCacheMiddleware',
	    ........
	    'django.middleware.cache.FetchFromCacheMiddleware'
	]	'"update" 必须配置在第一个位置"fetch" 必须配置在最后一个位置'

视图函数缓存

python 复制代码
	import datetime
	from django.views.decorators.cache import cache_page  导入缓存装饰器模块
	@cache_page(timeout=10)  装饰器
	def demo2(request):
	    ctime = datetime.datetime.now()
	    return render(request,'demo2.html',{'ctime':ctime})

局部缓存

python 复制代码
	放在模版层使用的:
	{% load cache %}
	 <h3 style="color: green">不缓存:-----{{ ctime }}</h3>
	{% cache 2 'name' %}
	 <h3>缓存:-----:{{ ctime }}</h3>
	{% endcache %}
相关推荐
孟健14 小时前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞16 小时前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
曲幽18 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
敏编程1 天前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪1 天前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
databook1 天前
ManimCE v0.20.1 发布:LaTeX 渲染修复与动画稳定性提升
python·动效
花酒锄作田1 天前
使用 pkgutil 实现动态插件系统
python
前端付豪2 天前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽2 天前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战2 天前
Pydantic配置管理最佳实践(一)
python