Django4中的缓存
详细文档参考:https://www.cnblogs.com/Neeo/articles/17589834.html
Django支持的缓存有好几种:
- 三方的Redis(推荐),Memcached(不推荐)
- 缓存到本地文件
- 缓存到本地数据库
- 缓存到内存里
- 虚拟缓存
缓存的粒度
局部视图缓存
缓存指定的视图函数,有两种写法.
- 在视图中以装饰器的形式
views.py
import datetime
from django.shortcuts import render, HttpResponse# 必须导入缓存装饰器
from django.views.decorators.cache import cache_page@cache_page(5) # 缓存单位:秒
def index(request):# print(1111)now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')return render(request, 'index.html', {"now": now})
urls.py
:
from django.contrib import admin
from django.urls import path
from api import viewsurlpatterns = [path('admin/', admin.site.urls),path('index/', views.index),
]
- 在路由中实现
views.py
import datetime
from django.shortcuts import render, HttpResponsedef index(request):# print(1111)now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')return render(request, 'index.html', {"now": now})
urls.py
from django.contrib import admin
from django.urls import path
from api import viewsfrom django.views.decorators.cache import cache_page
urlpatterns = [path('admin/', admin.site.urls),# path('index/', views.index),path('index/', cache_page(5)(views.index)), # 缓存,路由中指定缓存的视图函数
]
模板缓存,粒度更新,相当于对于页面的局部进行缓存
views.py中正常写代码:
import datetime
from django.shortcuts import render, HttpResponse
# 必须导入缓存装饰器
# from django.views.decorators.cache import cache_page
#
#
# @cache_page(5) # 缓存单位:秒
def index(request):# print(1111)now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')return render(request, 'index.html', {"now": now})
urls.py正常写代码:
from django.contrib import admin
from django.urls import path
from api import views# from django.views.decorators.cache import cache_page
urlpatterns = [path('admin/', admin.site.urls),path('index/', views.index),# path('index/', cache_page(5)(views.index)), # 缓存,路由中指定缓存的视图函数
]
index.html这里就需要注意了。
- 必须load cache
- 必须用缓存的模板把要缓存的内容包起来,才能被缓存上,其它没包裹的标签,不缓存。
{% load cache %} <!-- 必须声明 -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3>没有缓存的</h3>
<p>{{ now }}</p><h3>有缓存的</h3>
<!-- cache 后面的5,表示缓存的时间,5后面的字符串来自于settings.py中的缓存配置中的LOCATION的值'unique-snowflake'-->
<!-- 用缓存的模板把要缓存的内容包起来-->
{% cache 5 'unique-snowflake' %}<p>{{ now }}</p><p>{{ now }}</p>
{% endcache %}
</body>
</html>
全栈缓存
就是整个项目进行缓存,粒度是最大的。
首先要配置settings.py
MIDDLEWARE = [# 下面这个缓存中间件必须放在所有中间件的最上面"django.middleware.cache.UpdateCacheMiddleware",'django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',# 下面这个缓存中间件必须放在所有中间件的最下面"django.middleware.cache.FetchFromCacheMiddleware",
]# 我这里将cache缓存由本地内存缓存更换为了Redis
CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://:@127.0.0.1:6379/2","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient","PASSWORD": "1234", # 密码,如果没有设置密码,这个参数可以注视掉# 'MAX_ENTRIES': 300, # 最大缓存个数(默认300)# 'CULL_FREQUENCY': 3, # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)}}
}# 默认超时时间是300秒,我们可以通过CACHE_MIDDLEWARE_SECONDS来修改
CACHE_MIDDLEWARE_SECONDS = 20
# 下面是关于key的,咱们这里保持默认就完了
CACHE_MIDDLEWARE_KEY_PREFIX = ""
# 用于存储的缓存别名,没想好的,指定个default就行
CACHE_MIDDLEWARE_ALIAS = "default"
views.py
正常写代码:
import datetime
from django.shortcuts import render, HttpResponse
# 必须导入缓存装饰器
# from django.views.decorators.cache import cache_page
#
#
# @cache_page(5) # 缓存单位:秒
def index(request):# print(1111)now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')return render(request, 'index.html', {"now": now})
urls.py
正常写代码:
from django.contrib import admin
from django.urls import path
from api import views# from django.views.decorators.cache import cache_page
urlpatterns = [path('admin/', admin.site.urls),path('index/', views.index),# path('index/', cache_page(5)(views.index)), # 缓存,路由中指定缓存的视图函数
]
index.html也正常写代码:
{% load cache %} <!-- 必须声明 -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3>没有缓存的</h3>
<p>{{ now }}</p><h3>有缓存的</h3>
{% cache 5 'unique-snowflake' %}<p>{{ now }}</p><p>{{ now }}</p>
{% endcache %}</body>
</html>
注意,如果同时使用了全栈缓存和局部模板片段缓存,那么全栈缓存的优先级高。
Redis
数据库排行榜:https://db-engines.com/en/ranking
redis是一个独立的非关系型数据。
官方建议,将Redis安装到Linux系统,所以,你在redis官网,压根看不到redis关于Windows的安装包。
redis3 for Windows
参考:https://www.cnblogs.com/Neeo/articles/12673194.html#windows
和讲解视频
redis3 for centos
参考:https://www.cnblogs.com/Neeo/articles/12673194.html#redis307-for-centos79
和讲解视频
注意,必须关闭你的centos系统的防火墙:
# 查看防火墙状态
systemctl status firewalld.service
# 关闭防火墙
systemctl stop firewalld.service
# 禁止开机启动防火墙
systemctl disable firewalld.service
# 启动防火墙
systemctl start firewalld.service
# 防火墙随系统开启启动
systemctl enable firewalld.service# 关闭selinux
[root@r ~]# sed -i.ori 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
关于Redis使用和python如何操作
参考我的博客:https://www.cnblogs.com/Neeo/p/10864123.html#database
关于Django如何操作Redis?参考:https://www.cnblogs.com/Neeo/articles/14269422.html