1. 程式人生 > >django框架中的緩存系統

django框架中的緩存系統

cme template memcached xxx cache 發送 系統 esp cmem

一、瀏覽器的緩存機制

  Cache-Control策略:

    Cache-Control和Expires的作用相似,即指出當前資源的有效期,控制瀏覽器是直接從瀏覽器緩存獲取數據還是發送Request到服務端獲取數據,只不過Cache-Control的選擇方式更多,設置詳細,如果要同時設置,優先級高於Expires。

技術分享圖片

技術分享圖片

Cache-Control: max-age=10,即設置緩存存儲的最大周期為10s,這和Date與Expires的差值相對應,private表明響應只能被單個用戶緩存,不能作為共享緩存(即代理服務器不能緩存它)。

Last-Modified:標示這個響應資源的最後修改時間。web服務器在響應請求時,告訴瀏覽器資源的最後修改時間。

二、Django中的緩存機制:

  1.Django緩存原理

由於django是動態網站,所以當客戶端發來請求時均會去對數據庫進行相應的操作,當網站訪問量大時,必然會更加耗時,最簡單的解決方式是使用緩存,緩存將某個視圖函數的返回值保存至內存或硬盤中。

django根據設置的緩存方式,瀏覽器第一次請求時,Cache會緩存響應的數據到硬盤或內存中,同時設置Response,當瀏覽器再次Request時,附帶f-Modified-Since請求時間到django,django發現f-Modified-Since會先去參數後,與緩存中的過期時間比較,如果緩存時間比較新,則會重新請求數據,並緩存數據後返回Response給瀏覽器,如果緩存沒有過期,則直接從緩存中獲取數據,Response

給瀏覽器。

1.1、緩存設置

  (1)設置中間件

1 django.middleware.cache.UpdateCacheMiddleware,  #必須設置在第一個位置 
2  ...其他中間件...
3 django.middleware.cache.FetchFromCacheMiddleware,#必須設置在最後一個位置

    (2)通用設置 

1 CACHE_MIDDLEWARE_ALIAS = default    #緩存別名
2 CACHE_MIDDLEWARE_SECONDS = 0  #頁面默認緩存時間,默認600
3 CACHE_MIDDLEWARE_KEY_PREFIX =
www.xxx.com #關鍵的前綴,當多個站點使用同一個配置的時候,這個可以設置可以避免發生沖突,一般設置為網站域名 4 CACHE_MIDDLEWARE_ANONYMOUS_ONLY = False #只有匿名的請求會被緩存,這是一個禁用緩存非匿名用戶頁面的最簡單的做法,註意確保已經啟用了Django用戶認證中間件

    1.2、Django的緩存方式

      (1)內存緩存

        利用本地內存緩存,這樣緩存是多進程和線程安全的。      

1 # 此緩存將內容保存至內存的變量中
2 # 配置:
3 CACHES = {
4        default: {
5        BACKEND: django.core.cache.backends.locmem.LocMemCache,
6        LOCATION: unique-snowflake,
7      }
8 }

        緩存LOCATION用來區分不同的內存存儲,如果只有一個本地內存緩存,可以忽略,如果有多

        個時,需要命名區分。

        每個進程都有它們自己的私有緩存實例,所以跨進程緩存是不可能的,因此,本地內存緩存不

        是特別有效率,建議只在內部開發測試時使用,不建議生產環境中使用。

      (2)Memcached

        此緩存使用python-memcached模塊連接Memcache,可以支持多個服務器上的Memcached

    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: [
                210.32.26.202:11211,
                210.32.26.203:11211,
            ]
        }
    }

      (3)數據庫

        註意:數據庫緩存使用的是配置文件中的數據庫作為默認數據庫,如果想使用其他數據庫,需要修改數據庫緩存表     

    # 此緩存將內容保存至數據庫

    # 配置:
        CACHES = {
            default: {
                BACKEND: django.core.cache.backends.db.DatabaseCache,
                LOCATION: my_cache_table, # 數據庫表
            }
        }

    # 註:執行創建表命令 python manage.py createcachetable 表名

      (4)數據庫

        註意:數據庫緩存使用的是配置文件中的數據庫作為默認數據庫,如果想使用其他數據庫,需要修改數據庫緩存表   

  

    # 此緩存將內容保存至文件
    # 配置:

        CACHES = {
            ‘default‘: {
                ‘BACKEND‘: ‘django.core.cache.backends.filebased.FileBasedCache‘,
                ‘LOCATION‘: ‘/var/tmp/django_cache‘,
            }
        }

    1.3、緩存應用

      (1)全站應用  

即使用中間件,經過一系列的認證等操作,如果內容在緩存中存在,則使用FetchFromCacheMiddleware獲取內容並返回給用戶,當返回給用戶之前,判斷緩存中是否已經存在,如果不存在則UpdateCacheMiddleware會將緩存保存至緩存,從而實現全站緩存。      

      (2)單獨視圖應用

    方式一:
        from django.views.decorators.cache import cache_page

        @cache_page(60 * 15)
        def my_view(request):
            ...

    方式二:
        from django.views.decorators.cache import cache_page

        urlpatterns = [
            url(r^foo/([0-9]{1,2})/$, cache_page(60 * 15)(my_view)),
        ]

      (3)局部視圖應用

    a. 引入TemplateTag

        {% load cache %}

    b. 使用緩存

        {% cache 5000 緩存key %}
            緩存內容
        {% endcache %}

        

django框架中的緩存系統