1. 程式人生 > 資料庫 >Django 快取配置Redis使用詳解

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,{'queryset':queryset})
# 當使用了cache後,訪問情況變成了如下:訪問一個網址時,嘗試從 cache 中找有沒有 快取內容,如果需要的資料在快取中沒有快取內容,則去資料庫取,渲染返回頁面,同時 將這些資料儲存在快取中,在一定時間內,當用戶再次訪問頁面時,就沒必要去資料庫取 了,直接從快取中拿到資料。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。