Django學習之十二:Cache 緩存組件


Django Cache 緩存組件

在FBV 或 CBV 需要緩存數據,又或者要進行全站緩存(利用中間件),單視圖緩存(利用裝飾器@cache_page(60 * 5) ),或者在template中使用{% cache 5 content_detail %} xxx {% endcache %} 進行頁面局部緩存。這些場景都是需要用到緩存,來提高我們響應用戶請求速度的。在django框架中,給我們提供了Cache組件,並暴露出滿足以上4中需求的接口,我們只需要配置好我們的緩存引擎源及相關配置,就可以方便使用了。

博文圖片掛了臨時解決辦法

緩存邏輯偽代碼


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作為默認緩存。

可配置參數說明

查看官網: cache配置參數說明, hint 這里!

01. Django的默認緩存


CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-snowflake'
    }
 }

該緩存引擎,對每一個進程是一個緩存,所以該緩存時線程安全的。(This cache is per-process (see below) and thread-safe.)
'LOCATION'設置時用於標識獨立的內存存儲。如果系統只有一個,那么可以忽略該設置。
由於時每個進程一個緩存實例,所以如果多線程或多進程,那么緩存的使用上就不是很高效,所以該緩存引擎不是非常適合生產環境,適合dev環境。

02. 基於Redis的django-redis

  • 安裝django-redis
# 通過pip安裝
>>> pip install django-redis
# 通過pipenv  安裝
>>> pyenv install django-redis
  • 安裝django-redis就會依賴安裝redis.py
  • 將默認的CACHES設置為django-redis並配置redis-server相關信息
    django-redis連接到redis-server使用的是redis連接池。
    所以django-redis也提供了一個接口,供我們直接從連接池中拿到redis連接,然后使用redis (get_redis_connection('default'));注意這種方式不是django cache組件提供的接口操作redis方式,這種方式是low-level的;而django cache組件則是在low-level基礎上封裝的更高級的接口,供我們使用。
  • 安裝完成django-redis后,配置為默認cache源:
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密碼在這里設置
        }
    }
}

03. 自定義cache

可以查看django_redis.cache.RedisCache 都是繼承了from django.core.cache.backends.base import BaseCache ,所以在django中高級的緩存操作都是通過BaseCache中定義的接口。

所以自定義cache backend 可以通過繼承django.core.cache.backends.base.BaseCache 接口,然后實現接口中的方法。就可以將自己的backend配置到django中使用了。

04. Django其它內置的緩存源,直接開箱使用out-of-the-box

django內置的cache backend:

使用cache的示例

Tips: 通過redis-cli 查看所有庫的key統計信息,命令是info keyspace;

1. cache在視圖中示例

# 引入裝飾器裝飾視圖函數即可緩存視圖
from django.views.decorators.cache import cache_page
  • FBV視圖緩存
import time
from django.views.decoratosr.cache import cache_page


@chace_page(60*5)  # 必須設置緩存的更新間隔,單位秒
def content_detail(request):
   return HTTPResponse('hello' + str(time.time()))

  • CBV視圖緩存
    特別注意:CBV的視圖緩存使用cache_page()是放入URLConf中,而不是對get或者post等CBV內的方法進行裝飾。

2. 全站緩存

在配置文件的中間件列表的首尾分別添加如下中間件:


MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',
    ......
    'django.middleware.common.CommonMiddleware',
    ......
    'django.middleware.cache.FetchFromCacheMiddleware',]

3. 利用模板系統頁面部分緩存

{% load cache %}
{% cache 500 sidebar %}
    .. sidebar ..
{% endcache %}

4. low-level api操作緩存

通過cache對象的api直接操作緩存。

  • 首先,拿到cache對象:
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 都是獨立的,不是同一個,為保證線程安全。

總結

  1. 參考:https://docs.djangoproject.com/en/2.1/topics/cache/#the-per-view-cache
  2. 從cache的backend引擎,將cache抽象出來,定義出cache的接口,實現細節各自引擎處理。
  3. 看到一句話: 抽象比細節活的更長久.


免責聲明!

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



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