快取

Sherwin_szw發表於2024-09-20

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

相關文章