Django 緩存配置Redis使用詳解
一、cache介紹
由于Django是動(dòng)態(tài)網(wǎng)站,所有每次請(qǐng)求均會(huì)去數(shù)據(jù)進(jìn)行相應(yīng)的操作,當(dāng)程序訪問(wèn)量大時(shí),耗時(shí)必然會(huì)更加明顯,最簡(jiǎn)單解決方式是使用:緩存。
緩存工作原理:緩存是將一些常用的數(shù)據(jù)保存內(nèi)存或者memcache中,在一定的時(shí)間內(nèi)有用戶來(lái)訪問(wèn)這些數(shù)據(jù)時(shí),則不再去執(zhí)行數(shù)據(jù)庫(kù)及渲染等操作,而是直接從內(nèi)存或memcache的緩存中去取得數(shù)據(jù),然后返回給用戶。
Django提供了6種緩存方式:
- 開(kāi)發(fā)調(diào)試緩存
- 內(nèi)存緩存
- 文件緩存
- 數(shù)據(jù)庫(kù)緩存
- 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": "密碼",
}
}
}
視圖中連接(手動(dòng)操作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("設(shè)置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")
三、應(yīng)用
全站使用緩存
使用中間件,經(jīng)過(guò)一系列的認(rèn)證等操作,如果內(nèi)容在緩存中存在,則使用 FetchFromCacheMiddleware 獲取內(nèi)容并返回給用戶,當(dāng)返回給用戶之前,判斷緩存中是否已經(jīng)存在,如果不存在則UpdateCacheMiddleware 會(huì)將緩存保存至緩存,從而實(shí)現(xiàn)全站緩存。
MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', # 放在第一 # 其他中間件... 'django.middleware.cache.FetchFromCacheMiddleware', # 放在最后 ] CACHE_MIDDLEWARE_ALIAS = "" # 用于存儲(chǔ)的緩存別名 CACHE_MIDDLEWARE_SECONDS = 600 # 每個(gè)頁(yè)面應(yīng)緩存的秒數(shù) CACHE_MIDDLEWARE_KEY_PREFIX = "" # 如果使用相同的Django安裝在多個(gè)站點(diǎn)之間共享緩存,請(qǐng)將其設(shè)置為站點(diǎn)名稱或此Django實(shí)例特有的其他字符串,以防止發(fā)生密鑰沖突。如果你不在乎,請(qǐng)使用空字符串。
測(cè)試
from django.shortcuts import HttpResponseimport time
def index(request):
t = time.time()
return HttpResponse("時(shí)間:{}".format(str(t)))
def home(request):
t = time.time()
return HttpResponse("時(shí)間:{}".format(str(t)))
可以發(fā)現(xiàn),index或者h(yuǎn)ome頁(yè)面第一次返回的時(shí)間是多少,往后10分鐘以內(nèi),時(shí)間都是不變的。
單獨(dú)視圖緩存(記得取消全站緩存中間件配置)
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("時(shí)間:{}".format(str(t)))
def home(request):
t = time.time()
return HttpResponse("時(shí)間:{}".format(str(t)))
這次,index頁(yè)面第一次訪問(wèn)返回的時(shí)間需要過(guò)10分鐘再次訪問(wèn)才能變化,而home頁(yè)面返回的時(shí)間是時(shí)時(shí)刻刻變化的。
模板局部視圖使用
# 1.引入TemplateTag
{% load cache %}
# 2.使用緩存
{% cache 600 name %} # 緩存超時(shí)(秒) 和 緩存片段的名稱(名稱按原樣使用)
緩存內(nèi)容
{% 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>
四、使用場(chǎng)景說(shuō)明
# 一般來(lái)說(shuō)我們用 Django 來(lái)搭建一個(gè)網(wǎng)站,要用到數(shù)據(jù)庫(kù)等。
from django.shortcuts import render
def index(request):
# 讀取數(shù)據(jù)庫(kù)等 并渲染到網(wǎng)頁(yè)
# 數(shù)據(jù)庫(kù)獲取的結(jié)果保存到 queryset 中
return render(request, 'index.html', {'queryset':queryset})
# 像這樣每次訪問(wèn)都要讀取數(shù)據(jù)庫(kù),一般的小網(wǎng)站沒(méi)什么問(wèn)題,當(dāng)訪問(wèn)量非常大的時(shí)候, 就會(huì)有很多次的數(shù)據(jù)庫(kù)查詢,肯定會(huì)造成訪問(wèn)速度變慢,服務(wù)器資源占用較多等問(wèn)題。
#--------------------------------------------------------------------
from django.shortcuts import render
from django.views.decorators.cache import cache_page
@cache_page(60 * 10) # 秒數(shù),這里指緩存10分鐘,不直接寫600是為了提高可讀性
def index(request):
# 讀取數(shù)據(jù)庫(kù)等 并渲染到網(wǎng)頁(yè)
return render(request, 'index.html', {'queryset':queryset})
# 當(dāng)使用了cache后,訪問(wèn)情況變成了如下:訪問(wèn)一個(gè)網(wǎng)址時(shí), 嘗試從 cache 中找有沒(méi)有 緩存內(nèi)容,如果需要的數(shù)據(jù)在緩存中沒(méi)有緩存內(nèi)容,則去數(shù)據(jù)庫(kù)取,渲染返回頁(yè)面,同時(shí) 將這些數(shù)據(jù)保存在緩存中,在一定時(shí)間內(nèi),當(dāng)用戶再次訪問(wèn)頁(yè)面時(shí),就沒(méi)必要去數(shù)據(jù)庫(kù)取 了,直接從緩存中拿到數(shù)據(jù)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
TensorFlow 多元函數(shù)的極值實(shí)例
今天小編就為大家分享一篇TensorFlow 多元函數(shù)的極值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python抓取某汽車網(wǎng)數(shù)據(jù)解析html存入excel示例
python抓取某汽車網(wǎng)經(jīng)銷商信息網(wǎng)頁(yè)數(shù)據(jù)解析html,這里提供一個(gè)示例演示,大家可以根據(jù)需要分析自己網(wǎng)站的數(shù)據(jù)2013-12-12
PyTorch中torch.cuda.amp相關(guān)警告的解決方法
在最近的寫代碼過(guò)程中,遇到了兩個(gè)與 PyTorch 的混合精度訓(xùn)練相關(guān)的警告信息,torch.cuda.amp.autocast和torch.cuda.amp.GradScaler,文中通過(guò)代碼示例給大家介紹了詳細(xì)的解決方法,需要的朋友可以參考下2025-02-02
python刪除指定目錄下的文件和文件夾的實(shí)現(xiàn)
在日常的辦公中,我們可以利用Python批量刪除文件和文件夾,本文就來(lái)介紹一下python刪除指定目錄下的文件和文件夾的實(shí)現(xiàn),感興趣的可以了解一下2024-01-01

