官方文檔html
緩存的出現就是爲了減輕對數據庫的壓力和加快內存訪問的速度.咱們的訪問請求最終都是返回一個大的字符串,緩存就是將這段字符串直接存儲起來,下次你來了,不用通過view去數據庫或者內存拿到數據再渲染返回,而是直接從緩存裏把上次的字符串交給你,很大的提升了速度,通常咱們會將持久不變的,訪問量大的數據放到緩存.(好比說一篇好的博客,不少人看,可是做者又不修改),實時性很高的不放緩存,好比博客訪問量.python
Django自帶緩存,提供了6中存儲模式:數據庫
- 開發調試
- 內存
- 文件
- 數據庫
- Memcache緩存(python-memcached模塊)
- Memcache緩存(pylibmc模塊)
每種存儲模式只須要修改配置就能夠了,其餘早django中的操做都是同樣,django
咱們先來看配置,寫在django settings.py裏面就ok:緩存
1 # 此爲開始調試用,實際內部不作任何操做 2 # 配置: 3 CACHES = { 4 'default': { 5 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 引擎 6 'TIMEOUT': 300, # 緩存超時時間(默認300,None表示永不過時,0表示當即過時) 7 'OPTIONS':{ 8 'MAX_ENTRIES': 300, # 最大緩存個數(默認300) 9 'CULL_FREQUENCY': 3, # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3) 10 }, 11 'KEY_PREFIX': '', # 緩存key的前綴(默認空) 12 'VERSION': 1, # 緩存key的版本(默認1) 13 'KEY_FUNCTION' 函數名 # 生成key的函數(默認函數會生成爲:【前綴:版本:key】) 14 } 15 } 16 17 18 # 自定義key函數 19 def default_key_func(key, key_prefix, version): 20 """ 21 Default function to generate keys. 22 23 Constructs the key used by all other methods. By default it prepends 24 the `key_prefix'. KEY_FUNCTION can be used to specify an alternate 25 function with custom key making behavior. 26 """ 27 return '%s:%s:%s' % (key_prefix, version, key) 28 29 def get_key_func(key_func): 30 """ 31 Function to decide which key function to use. 32 33 Defaults to ``default_key_func``. 34 """ 35 if key_func is not None: 36 if callable(key_func): 37 return key_func 38 else: 39 return import_string(key_func) 40 return default_key_func
1 # 此緩存將內容保存至內存的變量中 2 # 配置: 3 CACHES = { 4 'default': { 5 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 6 'LOCATION': 'unique-snowflake', 7 } 8 } 9 10 # 注:其餘配置同開發調試版本
1 # 此緩存將內容保存至數據庫 2 3 # 配置: 4 CACHES = { 5 'default': { 6 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 7 'LOCATION': 'my_cache_table', # 數據庫表 8 } 9 } 10 11 # 注:執行建立表命令 python manage.py createcachetable
Memcache緩存(python-memcached模塊)
Memcache緩存(pylibmc模塊)
# 此緩存將內容保存至文件 # 配置: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', } } # 注:其餘配置同開發調試版本
應用:ide
Django提供的緩存支持memcached
- 單獨的頁面緩存
- 頁面局部緩存
- 全局緩存
1單獨的views緩存,存儲位置設置爲文件函數
Django settings.py 裏面配置:url
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': os.path.join(BASE_DIR,'caches'),#cache的存儲位置 } }
views:spa
from django.shortcuts import render from django.views.decorators.cache import cache_page @cache_page(10) # 導入模塊後加上裝飾器就就完成了單獨的頁面緩存 import time def cache001(req): t=time.time() return render(req,'cache001.html',{'time':t})
#這裏用了一個動態的時間來驗證是否緩存
#結果就是第一次發起請求後,整個頁面的返回字符串存儲到了文件位置,再次訪問的時候直接讀取到了文件裏面的內容返回,因此時間在緩存生命週期裏面是不會改變的
頁面局部的緩存
不少時候咱們頁面只須要一些數據緩存:
settings..py 配置,用了數據庫
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', # 數據庫表 } } #寫在sttings裏面後執行下, python manage.py createcachetable ,就能再數據庫中找到表了
局部緩存是寫在HTML中的:
#HTNL {% load cache %}#加載cache <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>{{ time }}</p> {% cache 5000 mycacher %} #5000表明超時時間, mycacher表明緩存的key, {{ time }} #須要緩存的內容 {% endcache %} </body> </html>
當我麼你發起請求後,數據庫緩存表就多了點東西了:
全局緩存:
此次咱們將緩存儲存在內存裏面,形式會是key value格式,因此會制定一個key:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'lglgl',#制定一個內存緩存的引用 } }
全局緩存會利用到咱們的中間件,在settings middleware中加上下面2箇中間件:
MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware',#-----放在最前面,用於儲存緩存 # 其餘中間件... 'django.middleware.cache.FetchFromCacheMiddleware',#----放在最後面,用於獲取緩存 ]
搞定.這就是django 提供的3中緩存方式和集中存儲地方,應該說是很強大了.