Django 配置緩存機制
**Django ** 是動態網站,一般來說需要實時地生成訪問的網頁,展示給訪問者,這樣,內容可以隨時變化,但是從數據庫讀多次把所需要的數據取出來,要比從內存或者硬盤等一次讀出來 付出的成本大很多。而使用緩存的話,可以將數據保存在緩存中,下次訪問的時候直接從緩存中獲得數據,而不用去請求后端數據庫,這樣服務器可以很快的響應請求,從而提高加載速度。
緩存系統工作原理
對於給定的網址,嘗試從緩存中找到網址,如果頁面在緩存中,直接返回緩存的頁面,如果緩存中沒有,一系列操作(比如查數據庫)后,保存生成的頁面內容到緩存系統以供下一次使用,然后返回生成的頁面內容。
一般來說我們用 Django 來搭建一個網站,要用到數據庫等。
from django.shortcuts import render
def index(request):
# 讀取數據庫等 並渲染到網頁
# 數據庫獲取的結果保存到 queryset 中
return render(request, 'index.html', {'book_list':book_list})
像這樣每次訪問都要讀取數據庫,一般的小網站沒什么問題,當訪問量非常大的時候,就會有很多次的數據庫查詢,肯定會造成訪問速度變慢,服務器資源占用較多等問題。
當使用了cache后,訪問情況就變化了。
from django.shortcuts import render
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # 秒數,這里指緩存 15 分鍾,不直接寫900是為了提高可讀性
def index(request):
# 讀取數據庫等 並渲染到網頁
return render(request, 'index.html', {'book_list':book_list})
# 訪問一個網址時, 嘗試從 cache 中找有沒有緩存內容
# 如果網頁在緩存中顯示緩存內容,否則生成訪問的頁面,保存在緩存中以便下次使用,顯示緩存的頁面。
Django settings 中 默認cache
也就是默認利用本地的內存來當緩存,速度很快。
當然可能出來內存不夠用的情況
from django.conf import settings
print(settings.CACHES)
{'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}
{
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
}
下面我們就來介紹一下各種緩存的配置:
緩存配置
利用文件系統來緩存
這個很簡單,就是將數據緩存在指定的目錄中。配置如下:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': '/var/tmp/django_cache', # linux 中的目錄,前提目錄必須存在
'TIMEOUT': 600,
'OPTIONS': {
'MAX_ENTRIES': 1000
}
}
}
使用Memcache來緩存:
Memcached 是目前 Django 可用的最快的緩存,
但是memcache需要你的服務器支持,也就是說需要有Memcache服務,
Linux系統安裝Memcached,首先要先安裝libevent庫。
$ yum -y install libevent ibevent-devel 聯網自動下載安裝
$ yum -y install install memcached linux安裝memcached 的方法我就不說了,自己去找去
然后需要pip3安裝Memcached的插件Python-mencached 和 pylibmc
$ pip3 install Python-mencached
$ pip3 install pylibmc
最后在setting.py配置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
'TIMEOUT': 600,
'OPTIONS': {
'MAX_ENTRIES': 2000
}
}
}
使用Local-memory來緩存:
這種緩存方式會將數據保存在服務器的內存中。
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'unique-snowflake',
'TIMEOUT': 600,
'OPTIONS': {
'MAX_ENTRIES': 2000
}
}
}
最推薦的緩存方式是Memcache或者Local-memory,要不就是文件緩存
Django使用Redis作為緩存
redis相信大家都很熟悉了,和memcached一樣是一個高性能的key-value數據庫,至於什么是緩存服務器,度娘都有很明白的介紹了,
安裝該數據庫是為了做服務器緩存。以下兩種情況都適合使用服務器緩存:
1)數據非經常更新。若每次都從硬盤讀取一次,浪費服務器資源、拖慢響應速度。
2)數據更新頻率較高,服務器負擔比較大。
這些數據只需每天更新一次。而我每次都從數據庫獲取相應的數據,計算統計排行情況和閱讀數。很明顯浪費服務器資源,浪費時間。解決方法是定時統計一次數據,保存到數據庫或文件中。每次讀取數據從中獲取。
若保存到數據庫,還需要額外建立一張對應的表存儲數據。在Django中建立表通常做法是建立一個模型。看似簡單,問題調試麻煩、開發時長久。所以我一直拖着沒處理該問題。畢竟一開始訪問量不是很多。后來不少網友訪客打開慢(當然服務器在國外也是個原因),查了資料發現Redis內存數據庫。可以將數據寫入到內存,再進行讀寫。減少計算量,可以有效提高服務器響應速度。
這么一來,我就不用創建新表創建模型。直接將數據寫入緩存,定時更新。獲取數據從服務器緩存獲取即可。
下面我就來介紹如何在Django中配置使用redis數據庫!
安裝django-redis
pip3 install django-redis
settings配置
# redis 緩存數據庫配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://192.168.32.130:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100},
"DECODE_RESPONSES":True,
"PASSWORD": "root",
}
}
}
views視圖中使用redis
# 視圖中使用redis緩存數據庫
from django_redis import get_redis_connection
conn = get_redis_connection('default')
全站緩存
在django中的settings配置文件中設置
'django.middleware.cache.UpdateCacheMiddleware',
# 其他中間件...
'django.middleware.cache.FetchFromCacheMiddleware',
單視圖緩存
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def cache(request):
# return HttpResponse('hello') # 當我們第一次訪問的時候,redis中已經存在了一個hello的值,當我們發送的數據發生改變的時候,這時候因為過期時間還沒到,不會清除緩存的信息。
return HttpResponse('hellodsafnjsakfaskfg')
在頁面中局部進行緩存
- 使用cache模板標簽來緩存模板的一個片段
- 需要兩個參數:
- 緩存時間,以秒為單位
- 給緩存片段起的名稱
步驟I. 引入TemplateTag
{% load cache %}
步驟II. 使用緩存
{% cache 5000 緩存key %} 緩存時間 5000秒
緩存內容
{% endcache %}
底層的緩存API
from django.core.cache import cache
設置:cache.set(鍵,值,有效時間)
獲取:cache.get(鍵)
刪除:cache.delete(鍵)
清空:cache.clear()
