django 學習筆記 14 快取機制

2021-05-22 17:13:11 字數 4206 閱讀 6883

快取設定在settings 檔案 的 cache_backend 中。 這裡是乙個cache_backend 所 有可用值的解釋。

memcached 是迄今為止可 用於django 的最快, 最有效的快取型別,memcached 是完全基於記憶體的快取框架, 在安裝了memcached 本身之後, 你將需要安裝memcached python 繫結, 它沒有直接和django 繫結。 這兩個可用版本。 選擇和安裝以下模組之一:

若要使用memcached 的django, 設定cache_backend 到memcached:/ / ip:port/, 其 中ip 是memcached 的守護程序的ip 位址,port 是memcached 執行的埠。

在這個例子中,memcached 運 行在本地主機 (127.0.0.1) 上, 埠為11211:

cache_backend = 『memcached://127.0.0.1:11211/』

memcached 的乙個極好的 特性是它在多個伺服器間分享快取的能力。這意味著您可以在多台機器上執行memcached 的守護程序, 該程式會把這些機器當成乙個單一快取, 而無需重複每台機器上的快取值。 要充分利用此功能, 請在cache_backend 裡引入所有伺服器的位址, 用分號分隔。這個例子中, 快取在執行在ip 位址為172.19.26.240 和172.19.26.242, 埠號為11211 的memcached 例項間分享:

cache_backend = 『memcached://172.19.26.240:11211;172.19.26.242:11211/』

這個例子中, 快取在執行在172.19.26.240( 埠11211),172.19.26.242( 埠11212),172.19.26.244 ( 端 口11213) 的memcached 例項間分享:

cache_backend = 『memcached://172.19.26.240:11211;172.19.26.242:11212;172.19.26.244:11213/』

最後有關memcached 的一 點是, 基於記憶體的快取有乙個重大的缺 點。 由於快取的資料儲存在記憶體中, 所 以如果您的伺服器崩潰, 資料將會消失。 顯然, 記憶體不是用來持久化資料的, 因此不要把基於記憶體的快取作為您唯一的儲存資料 快取。 毫無疑問, 在django 的快取後端不應該用於持久化, 它們本來就被設計成快取的解決方案。但我們仍然 指出此點, 這裡是因為基於記憶體的快取是 暫時的。

資料庫快取為了使用資料庫表作為快取後端, 首 先在資料庫中執行這個命令以建立快取表:

python manage.py createcachetable [cache_table_name]

這裡的[cache_table_name] 是 要建立的資料庫表名。 ( 這個名字隨你 的便, 只要它是乙個有效的表名, 而且不是已經在您的資料庫中使用的表名。) 這個命令以django 的資料庫快取系統所期望的格式建立乙個 表。一旦你建立了資料庫表, 把你的cache_backend 設定為」db://tablename」, 這裡的tablename 是資料庫表的名字, 在這個例子中, 快取表名為my_cache_table: 在這個例子中, 快取記憶體表的名字是my_cache_table:

cache_backend = 『db://my_cache_table』

資料庫快取後端使用你的settings 文 件指定的同一資料庫。你不能為你的快取表使用不同的資料庫後端. 如果你已經有了乙個快速, 良好的索引資料庫伺服器, 那麼資料庫快取的效果最明顯。

要把快取專案放在檔案系統上, 請 為cache_backend 使用」file://「 的快取型別。例如, 要把快取資料儲存在/var/tmp/django_cache 上, 請使用此設定:

cache_backend = 『file:///var/tmp/django_cache』

如果你的伺服器以使用者apache 運 行, 確認/var/tmp/django_cache 存在並 且使用者apache 可以讀寫/var/tmp/django_cache 目 錄。

如果你想利用記憶體快取的速度優勢, 但 又不能使用memcached, 可以考 慮使用本地儲存器快取後端。 此快取的多程序和執行緒安全。 設定 cache_backend 為 locmem:/// 來使用它, 例如:

cache_backend = 『locmem:///』

假如你有乙個產品站點, 在許多地 方使用高度快取, 但在開發/ 測試環境中, 你不想快取, 也不想改變**, 這就非常有用了。 要啟用虛擬快取, 就像這樣設定cache_backend:

cache_backend = 『dummy:///』

使用自定義快取後端

外部快取後端, 需要使用乙個python import 路徑作為的cache_backend uri 的( 第乙個冒號前的部分), 像這樣:

cache_backend = 『path.to.backend://』

一旦快取記憶體設定, 最簡單的方法 是使用快取快取整個**。您需要新增』django.middleware.cache.updatecachemiddleware』 和『django.middleware.cache.fetchfromcachemiddleware』 到 您的middleware_classes 設 置中, 在這個例子中是:

middleware_classes = (

『django.middleware.cache.updatecachemiddleware』,

『django.middleware.common.commonmiddleware』,

『django.middleware.cache.fetchfromcachemiddleware』, )

更加顆粒級的快取框架使用方法是對單個檢視的輸出進行快取。 django.views.decorators.cache 定義了乙個自動快取檢視響應的cache_page 裝飾器。 他是很容易使用的:

from django.views.decorators.cache import cache_page

def my_view(request):

# …

my_view = cache_page(my_view, 60 * 15)

以下是同乙個 urlconf , 不 過用 cache_page 包裹了 my_view :

from django.views.decorators.cache import cache_page

urlpatterns = (」,

(r』^foo/(/d)/$』, cache_page(my_view, 60 * 15)), )

如果採取這種方法, 不要忘記在 urlconf 中匯入 cache_page 。

你同樣可以使用cache 標籤來 快取模板片段。 在模板的頂端附近加入 以通知模板訪問快取標籤。模板標籤 在給定的時間內快取了塊的內容。 它至少需要兩個引數: 快取超時時間( 以秒計) 和指定快取片段的名稱。 示例:

.. sidebar ..

有時你可能想快取基於片段的動態內容的多份拷貝。 比如, 你想為上乙個例子的每個使用者分別快取側邊欄。這樣只需要給 傳遞額外的引數以標識快取片 段。

.. sidebar for logged in user ..

比如說, 也許你的站點所包含的一 個檢視依賴幾個費時的查詢, 每隔一段時 間結果就會發生變化。 在這種情況下, 使 用站點級快取或者檢視級快取策略所提供的整頁快取並不是最理想的, 因為你可能不會想對整個結果進行快取( 因為一些資料經常變化), 但你仍然會想對很少變化的部分進行快取。

針對這樣的情況,django 提 供了簡單低階的快取api 。 你可以通過這個api, 以任何你需要的 粒度來快取物件。 你可以對所有能夠安全進行 pickle 處理的 python 對 象進行快取: 字串、字典和模型物件 列表等等。 ( 查閱 python 文件可以了解到更多關於 pickling 的資訊。)

但還有一種與 web 開發相關 的快取: 上游快取。 有一些系統甚至在請求到達站點之前就為使用者進行頁面快取。

上游快取將會產生非常明顯的效率提公升, 但 也存在一定風險。 許多網頁的內容依據身份驗證以及許多其他變數的情況發生變化, 快取系統僅盲目地根據 url 儲存頁面, 可能會向這些頁面的後續訪問者暴露不正確或者敏感的資料。

舉個例子, 假定你在使用網頁電郵 系統, 顯然收件箱頁面的內容取決於登入 的是哪個使用者。 如果 isp 盲目地 快取了該站點, 那麼第乙個使用者通過該 isp 登入之後, 他( 或她) 的使用者收件箱頁面將會快取給後續的訪問者。 這一點也不好玩。

Django 框架14 快取

快取 1.快取 對於中等流量的 來說,盡可能地減少開銷是必要的。快取資料就是為了儲存那些需要很多計算資源的結果,這樣的話就不必在下次重複消耗計算資源 django自帶了乙個健壯的快取系統來儲存動態頁面,避免對於每次請求都重新計算 django提供了不同級別的快取粒度 可以快取特定檢視的輸出 可以僅僅...

JPA學習筆記(14) 查詢快取

執行以下 string jpql from user u where u.id query query entitymanager.createquery jpql query.setparameter 1,1 user user user query.getsingleresult query e...

Django快取筆記

設定快取 memcached 使用模組python memcached和模組pylibmc 更改setting 檔案的caches 配置 將 backend 設定為django.core.cache.backends.memcached.memcachedcache或者django.core.cac...