Django 緩存之配置Redis


一、cache介紹

由於Django是動態網站,所有每次請求均會去數據進行相應的操作,當程序訪問量大時,耗時必然會更加明顯,最簡單解決方式是使用:緩存。

緩存工作原理:緩存是將一些常用的數據保存內存或者memcache中,在一定的時間內有用戶來訪問這些數據時,則不再去執行數據庫及渲染等操作,而是直接從內存或memcache的緩存中去取得數據,然后返回給用戶。

Django提供了6種緩存方式:

  • 開發調試緩存
  • 內存緩存
  • 文件緩存
  • 數據庫緩存
  • Memcache緩存(使用python-memcached模塊)
  • Memcache緩存(使用pylibmc模塊)

這里不多介紹,有興趣的可以去看看官方文檔:https://docs.djangoproject.com/en/dev/topics/cache/

二、Redis緩存

要想在Django配置Redis緩存,則需要先安裝依賴:

pip3 install django-redis

settings.py配置:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100}
            # "PASSWORD": "密碼",
        }
    }
}

視圖中連接(手動操作redis):

from django.shortcuts import HttpResponse
from django_redis import get_redis_connection def index(request):
    r = get_redis_connection("default")
    r.hmset("name_a", {"key_a": "value_a", "key_b": "value_b"})
    return HttpResponse("設置redis")

def order(request):
    r = get_redis_connection("default")
    val = r.hmget("name_a", ["key_a", "key_b"])
    print(val)  # [b'value_a', b'value_b']
    return HttpResponse("獲取redis")

三、應用

全站使用緩存

使用中間件,經過一系列的認證等操作,如果內容在緩存中存在,則使用 FetchFromCacheMiddleware 獲取內容並返回給用戶,當返回給用戶之前,判斷緩存中是否已經存在,如果不存在則UpdateCacheMiddleware 會將緩存保存至緩存,從而實現全站緩存。

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',  # 放在第一
    # 其他中間件...
    'django.middleware.cache.FetchFromCacheMiddleware',  # 放在最后
]

CACHE_MIDDLEWARE_ALIAS = ""          # 用於存儲的緩存別名
CACHE_MIDDLEWARE_SECONDS = 600       # 每個頁面應緩存的秒數 
CACHE_MIDDLEWARE_KEY_PREFIX = ""     # 如果使用相同的Django安裝在多個站點之間共享緩存,請將其設置為站點名稱或此Django實例特有的其他字符串,以防止發生密鑰沖突。如果你不在乎,請使用空字符串。

測試:

from django.shortcuts import HttpResponseimport time
def index(request):
    t = time.time()
    return HttpResponse("時間:{}".format(str(t)))

def home(request):
    t = time.time()
    return HttpResponse("時間:{}".format(str(t)))

可以發現,index或者home頁面第一次返回的時間是多少,往后10分鍾以內,時間都是不變的。

單獨視圖緩存(記得取消全站緩存中間件配置)

from django.shortcuts import HttpResponse
from django.views.decorators.cache import cache_page import time

@cache_page(60 * 10) def index(request):
    t = time.time()
    return HttpResponse("時間:{}".format(str(t)))

def home(request):
    t = time.time()
    return HttpResponse("時間:{}".format(str(t)))

這次,index頁面第一次訪問返回的時間需要過10分鍾再次訪問才能變化,而home頁面返回的時間是時時刻刻變化的。

模板局部視圖使用

# 1.引入TemplateTag
    {% load cache %}

# 2.使用緩存
    {% cache 600 name %}  # 緩存超時(秒) 和 緩存片段的名稱(名稱按原樣使用)
        緩存內容
    {% endcache %}

示例:

# views.py
from django.shortcuts import render
import time

def index(request):
    t = time.time()
    return render(request, "index.html", {"t": t})
# index.html
<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body> {% load cache %} {% cache 10 current_time %} <h1>{{ t }}</h1> {% endcache %} </body>
</html>

四、使用場景說明

# 一般來說我們用 Django 來搭建一個網站,要用到數據庫等。

from django.shortcuts import render
def index(request):
    # 讀取數據庫等 並渲染到網頁
    # 數據庫獲取的結果保存到 queryset 中
    return render(request, 'index.html', {'queryset':queryset})
# 像這樣每次訪問都要讀取數據庫,一般的小網站沒什么問題,當訪問量非常大的時候,  就會有很多次的數據庫查詢,肯定會造成訪問速度變慢,服務器資源占用較多等問題。

#--------------------------------------------------------------------

from django.shortcuts import render
from django.views.decorators.cache import cache_page
 
@cache_page(60 * 10)  # 秒數,這里指緩存10分鍾,不直接寫600是為了提高可讀性
def index(request):
    # 讀取數據庫等 並渲染到網頁
    return render(request, 'index.html', {'queryset':queryset})
# 當使用了cache后,訪問情況變成了如下:訪問一個網址時, 嘗試從 cache 中找有沒有  緩存內容,如果需要的數據在緩存中沒有緩存內容,則去數據庫取,渲染返回頁面,同時  將這些數據保存在緩存中,在一定時間內,當用戶再次訪問頁面時,就沒必要去數據庫取  了,直接從緩存中拿到數據。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM