Django緩存系統


緩存

Django 是動態Web后台框架,需要實時生成用戶訪問的頁面,進行多次的數據庫操作,但是多次的數據庫訪問操作對於整個Web系統來說,會影響效率,尤其是當訪問量增大時,數據庫的壓力也會越來越大。

相對於磁盤及內存操作,數據庫的訪問操作付出的成本要大的多

瀏覽器第一次請求時,cache會緩存單個變量或整個網頁等內容到硬盤或者內存中,同時設置response頭部

當瀏覽器再次發起請求時,會與緩存中的過期時間相比較,如果緩存時間比較新,則會重新請求數據,並緩存起來然后返回response給客戶端,如果緩存沒有過期,則直接從緩存中提取數據,返回給response給客戶端

Cache-Control

HTTP協議頭Cache-ControlCache-ControlExpires的作用一致,都是指明當前資源的有效期,控制瀏覽器是否直接從瀏覽器緩存取數據還是重新發請求到服務器取數據。只不過Cache-Control的選擇更多,設置更細致,如果同時設置的話,其優先級高於Expires

python中使用memcached需要我們額外安裝memcached作為memcache客戶端的支持

1
pip3 install python-memcached -i https://pypi.tuna.tsinghua.edu.cn/simple

Cache設置

memcached

  • 安裝memcached

    1
    2
    apt-get install memcached # debian
    yum install memcached # centos
  • 配置文件:/etc/memcached.conf

    配置文件中有兩個可能需要修改的參數

    1
    2
    -m 64 #memcached所能使用的內存大小
    -l 127.0.0.1 #監聽的IP地址
  • 開啟|關閉memcached服務

    1
    2
    systemctl start memcached # 開啟
    systemctl stop memcached # 關閉
  • 查看服務狀態

    1
    systemctl status memcached

settings配置

使用memcached緩存,首先需要在項目的settings文件下進行配置

1
2
3
4
5
6
7
8
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
# 指定緩存使用的引擎
'LOCATION':'172.16.19.26:11211',
# 指定緩存服務器地址,常為本機地址
}
}

視圖緩存

可以只為某些視圖函數進行緩存

使用django.views.decorators.cache下的裝飾器cache_page進行視圖函數裝飾即可

  • 模型類的表代碼
1
2
class People(models.Model):
name = models.CharField(max_length=20,verbose_name='名字')
  • 視圖函數代碼
1
2
3
4
5
6
7
from django.views.decorators.cache import cache_page

@cache_page(10) # 緩存10秒
def index(request):
print('視圖函數被調用')
ss = models.People.objects.all()
return render(request, 'index.html', locals())
  • 模板頁面代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>展示數據</title>
</head>
<body>
{% for s in ss %}
<li>{{ s.name }} </li>
{% endfor %}
</body>
</html>

在第一次刷新瀏覽器之后,

立即在數據庫中添加一個新的數據對象

接着繼續刷新瀏覽器,前端頁面將會讀取緩存中的結果,而不會顯示剛才添加的用戶

除了在視圖函數上使用裝飾器進行緩存設置,還可以在路由匹配部分使用相同裝飾器函數進行設置

全站緩存

將整站所有視圖設置緩存,需要在配置文件的中間件設置首尾部分添加如下內容

1
2
3
4
5
6
7
8
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware', # 首部要添加的中間件
# 將response緩存起來
'django.middleware.security.SecurityMiddleware',
...
'django.middleware.cache.FetchFromCacheMiddleware',# 尾部要添加的中間件
# 將緩存的response取出來
]

以及搭配設置當前全站緩存有效時間的全局變量

1
CACHE_MIDDLEWARE_SECONDS = 10 # 每頁頁面緩存的秒數,默認為600

局部緩存

局部緩存主要為在模板頁面,選擇某個區域進行緩存,當用戶再次訪問相同頁面時,如設置緩存未過期,則渲染時局部緩存不會重新生成

1
2
3
4
5
{% load cache %}
局部緩存首先需要加載cache標簽

{% cache sec key %}
{% endcache %}

以時間模板變量為例,做一個簡單的測試,后台視圖函數每次在訪問時,返回當前時間

1
2
import time 
now = time.strftime('%H:%M:%S', time.localtime())

模板頁面在使用時的代碼

1
2
3
4
5
6
{% load cache %}

<p>這里是未緩存的時間:{{ now }}</p>
{% cache 10 time %}
<p>這里是緩存的時間:{{ now }}</p>
{% endcache %}

手動緩存

除了以上應用於各個業務中的緩存方式,還可以使用django所提供的cache接口進行緩存設置以及獲取

  • 設置緩存
1
2
3
4
from django.core.cache import cache
#存儲緩存數據
cache.set('cache_key',data,60*15)
#cache_key為存儲在緩存中的唯一值,data為存儲的數據,60*15為緩存有效時間
  • 獲取緩存
1
2
3
#獲取緩存數據
cache.get('cache_key','獲取不到的默認值')
#cache_key為儲存緩存數據的唯一值
  • 避免key值重復導致更新緩存,可以使用cache.add函數,基本用法與set相同
1
2
3
status = cache.add('add_key', 'New value')
# 當指定key值的緩存存在,add方法不會嘗試更新緩存
# 返回值status為True時,代表存儲成功,False代表存儲失敗
  • 清除緩存,通過cache.delete方法,該方法接收一個緩存key
1
cache.delete('cache_key')
  • 清空緩存,通過cache.clear方法,直接從緩存中清除所有
1
cache.clear()

注意

memcached不允許使用超過250個字符或包含空格或控制字符的緩存鍵值

使用這樣的鍵值將會導致異常


免責聲明!

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



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