[toc]python
在FBV 或 CBV 須要緩存數據,又或者要進行全站緩存(利用中間件),單視圖緩存(利用裝飾器@cache_page(60 * 5) ),或者在template中使用{% cache 5 content_detail %} xxx {% endcache %} 進行頁面局部緩存。這些場景都是須要用到緩存,來提升咱們響應用戶請求速度的。在django框架中,給咱們提供了Cache組件,並暴露出知足以上4中需求的接口,咱們只須要配置好咱們的緩存引擎源及相關配置,就能夠方便使用了。redis
博文圖片掛了臨時解決辦法 django
given a URL, try finding that page in the cache if the page is in the cache: return the cached page else: generate the page save the generated page in the cache (for next time) return the generated page
在配置settings.py中CACHES = {} 字典中, 添加緩存源,key爲緩存源的別名,django默認給咱們提供了一個默認緩存,而且是LocMemCahce即memcahe做爲緩存引擎。固然能夠配置多個緩存源,可是'default'只有一個,這個是默認使用的。固然默認的也能夠替換,好比如今流行用reids做爲默認緩存。api
查看官網: cache配置參數說明, hint 這裏!緩存
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake' } }
該緩存引擎,對每個進程是一個緩存,因此該緩存時線程安全的。(This cache is per-process (see below) and thread-safe.) 'LOCATION'設置時用於標識獨立的內存存儲。若是系統只有一個,那麼能夠忽略該設置。 因爲時每一個進程一個緩存實例,因此若是多線程或多進程,那麼緩存的使用上就不是很高效,因此該緩存引擎不是很是適合生產環境,適合dev環境。安全
# 經過pip安裝 >>> pip install django-redis # 經過pipenv 安裝 >>> pyenv install django-redis
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': 1000 }, # 'PASSWORD': 'xxx', # 若是有設置了redis-server密碼在這裏設置 } } }
能夠查看django_redis.cache.RedisCache 都是繼承了from django.core.cache.backends.base import BaseCache ,因此在django中高級的緩存操做都是經過BaseCache中定義的接口。bash
因此自定義cache backend 能夠經過繼承django.core.cache.backends.base.BaseCache 接口,而後實現接口中的方法。就能夠將本身的backend配置到django中使用了。多線程
Tips: 經過redis-cli 查看全部庫的key統計信息,命令是info keyspace;ide
# 引入裝飾器裝飾視圖函數便可緩存視圖 from django.views.decorators.cache import cache_page
import time from django.views.decoratosr.cache import cache_page @chace_page(60*5) # 必須設置緩存的更新間隔,單位秒 def content_detail(request): return HTTPResponse('hello' + str(time.time()))
在配置文件的中間件列表的首尾分別添加以下中間件:
MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', ...... 'django.middleware.common.CommonMiddleware', ...... 'django.middleware.cache.FetchFromCacheMiddleware',]
{% load cache %} {% cache 500 sidebar %} .. sidebar .. {% endcache %}
經過cache對象的api直接操做緩存。
from django.core.cache import caches #這是全部設置的cache對象的字典 from django.core.cache import cache # 這是」default" 默認的cahce對象 my_cache = caches['mycache'] my_cache.set('k1', 'abc', 30) # 設置k1 值爲 ’abc' 有效期 30s.
Note: 注意,每一個process 獲取的 cache instance 都是獨立的,不是同一個,爲保證線程安全。