1. 程式人生 > >Django中的快取

Django中的快取


由於Django是動態網站,所以每次請求都會去資料庫中進行響應的操作。
當程式訪問量大時,耗時必然會更加明顯,最簡單的解決方案就是使用快取。

Django中的快取:
即將某一個view的返回值儲存至記憶體或memcache中,預設儲存5分鐘。在此時間內如果有人來訪問此view,則不會去執行此view,而是直接從記憶體或memcache中獲取此view的返回值,並返回.

Django中提供了6種快取方式:

  1. 開發除錯
  2. 記憶體
  3. 檔案
  4. 資料庫
  5. Memcache快取(python-memcached模組)
  6. Memcache快取(pylibmc模組)


配置:


開發除錯:

# 開發除錯用,實際內部不做任何操作,即不會快取
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',  # 引擎,指定為開發除錯
        'TIMEOUT': 300,  # 超時時間
        'OPTIONS': {
            'MAX_ENTRIES': 300,  # 快取的最大個數(預設300)
            'CULL_FREQUENCY': 3,  # 快取超過最大個數後,剔除快取個數的比例, 即:1/CULL_FREQUENCY(預設3)
}, # 'KEY_PREFIX': '', # 快取key的字首(預設空) # 'VERSION': 1, # 快取key的版本(預設1) # 'KEY_FUNCTION': "函式名", # 生成key的函式(預設函式會生成為【字首:版本:keyy】) }, }

快取到記憶體:

# 此快取將內容儲存至記憶體的變數中
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'
, # 引擎,指定為記憶體快取 'LOCATION': 'unique-snowflake', # 唯一標識 'TIMEOUT': 300, # 超時時間 'OPTIONS': { 'MAX_ENTRIES': 300, # 快取的最大個數(預設300) 'CULL_FREQUENCY': 3 # 快取超過最大個數後,剔除快取個數的比例, 即:1/CULL_FREQUENCY(預設3) } } }

快取到檔案:

# 此快取將內容儲存至檔案
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',  # 引擎,指定為檔案快取
        'LOCATION': '/Users/macbook/django_cache',  # 快取的資料夾路徑(需要手動建立好資料夾)
    }
}
# 注:其他配置同開發除錯版本

快取到資料庫:

# 此快取將內容儲存至資料庫
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',  # 資料庫表
    }
}
# 將以上配置寫好之後,執行命令:python manage.py createcachetable, 將會自動建立資料表

Memcache快取(python-memcached模組):

# 此快取使用python-memcached模組連線memcache

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': 'unix:/tmp/memcached.sock',
    }
}

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]
    }
}

Memcache快取(pylibmc模組):

# 此快取使用pylibmc模組連線memcache

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': '/tmp/memcached.sock',
    }
}

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': [
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]
    }
}


應用:


全站使用:

使用中介軟體,經過一系列的認證等操作,如果內容在快取中存在,則使用FetchFromCacheMiddleware獲取內容並返回給使用者。在返回給使用者之前,判斷快取中是否已經存在,如果不存在,則UpdateCacheMiddleware會將資料儲存至快取,從而實現全站快取。

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',  # 放快取(要寫在中介軟體列表的頭部)
	···
	# 其它中介軟體
	···
    'django.middleware.cache.FetchFromCacheMiddleware',  # 獲取快取(要寫在中介軟體列表的尾部)
]

# 中介軟體快取配置
# CACHE_MIDDLEWARE_SECONDS = 5  # 超時時間(指定int型別)
# CACHE_MIDDLEWARE_ALIAS = ''  # 別名
# CACHE_MIDDLEWARE_KEY_PREFIX = ''  # 關鍵的字首

單獨檢視快取:

# 方式一:
from django.views.decorators.cache import cache_page  # 用於快取檢視

@cache_page(5)  # 指定快取時間為5秒(預設15*60)
def test(request):
	pass


# 方式二:
from django.views.decorators.cache import cache_page  # 用於快取檢視

urlpatterns = [
    url(r'^test/$', cache_page(5)(views.test)),
    # cache_page(5):指定快取時間為5秒
    # (views.test):執行的檢視函式
]

區域性模版使用:

# 引入TemplateTag
{% load cache %}

# 使用快取
{% cache 超時時間(s) 快取key %}
	"""將要快取的內容寫在此處"""
{% endcache %}

更多:點我