缓存

Django4中的缓存

详细文档参考:https://www.cnblogs.com/Neeo/articles/17589834.html

Django支持的缓存有好几种:

  • 三方的Redis(推荐),Memcached(不推荐)
  • 缓存到本地文件
  • 缓存到本地数据库
  • 缓存到内存里
  • 虚拟缓存

image-20230730174240977

缓存的粒度

局部视图缓存

缓存指定的视图函数,有两种写法.

  1. 在视图中以装饰器的形式

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index),
]
  1. 在路由中实现

views.py

import datetime
from django.shortcuts import render, HttpResponse


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)),  # 缓存,路由中指定缓存的视图函数
]

模板缓存,粒度更新,相当于对于页面的局部进行缓存

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这里就需要注意了。

  1. 必须load cache
  2. 必须用缓存的模板把要缓存的内容包起来,才能被缓存上,其它没包裹的标签,不缓存。
{% 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

image-20230730190025435

关于Django如何操作Redis?参考:https://www.cnblogs.com/Neeo/articles/14269422.html

本文作者:Sherwin

本文链接:https://www.cnblogs.com/sherwin1995/p/18422735

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Sherwin_szw  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.