您好,登錄后才能下訂單哦!
最近在主要負責公司寫公司的財務核算、財務統計功能,同時也突擊惡補了一些財務方面的知識(這些都是次要的),其中最重要的一點是要生成一張資產負債表。當然在生成資產負債表的時候,代碼肯定會去數據庫中查詢大量符合條件的數據,然后在進行計算得出結果,這當中必然會影響到頁面的響應速度(后經測試,打開頁面要花55秒),為了提高第二次打開頁面的速度,我想到了使用緩存。下面簡單的講講django緩存相關的知識吧,由于水平有限,不足之處,敬請諒解。
緩存是指將需要頻繁訪問的網絡內容放在離用戶較近訪問速度更快的系統中。緩存方案常見的有兩種,一種是客戶端,也就是web開發中的瀏覽器;一種就是服務端,以Memcached為代表。這里主要講服務端緩存。
下面用一些為代碼來講講緩存是怎樣在動態網頁中工作的:
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
Django自帶了緩存系統,為了方便起見,Django提供了不同級別的緩存粒度:可以緩存特定視圖的輸出、可以僅僅緩存那些很難生產出來的部分、或者你可以緩存你的整個網站。
一、在django中設置緩存
(1)Memcached
按照百度上解釋,它是一個高性能的分布式內存對象緩存系統,用于動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。Memcached基于一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,并通過memcached協議與守護進程通信
存儲方式是memcached中保存的數據都存儲在memcached內置的內存存儲空間中,因此它不能取代數據庫或者文件系統的使用。由于數據僅存在于內存中,因此重啟memcached、重啟操作系統會導致全部數據消失。另外,內容容量達到指定值之后,就基于LRU(Least Recently Used)算法自動刪除不使用的緩存。memcached本身是為緩存而設計的服務器,因此并沒有過多考慮數據的永久性問題。
在安裝 Memcached 后, 還需要安裝 Memcached 依賴模塊。Python 有不少Memcache模塊最為常用的是python-memcached and pylibmc兩個模塊.
ubuntu系統安裝命令:
sudo apt-get install memcached pip install python-memcached
在Django中使用Memcached時:
將 BACKEND 設置為django.core.cache.backends.memcached.MemcachedCache 或者 django.core.cache.backends.memcached.PyLibMCCache (取決于你所選綁定memcached的方式)
將 LOCATION 設置為 ip:port 值,ip 是 Memcached 守護進程的ip地址, port 是Memcached 運行的端口。或者設置為 unix:path 值,path 是 Memcached Unix socket file的路徑.
下面的例子中,Memcached 運行再 本地 (127.0.0.1) 的11211端口,使用 python-memcached:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': '127.0.0.1:11211', } }
下面的例子中,Memcached 通過一個本地的Unix socket file/tmp/memcached.sock 來交互,也使用python-memcached:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': 'unix:/tmp/memcached.sock', } }
Memcached有一個非常好的特點就是可以讓幾個服務的緩存共享。 這就意味著你可以再幾個物理機上運行Memcached服務,這些程序將會把這幾個機器當做 同一個 緩存,從而不需要復制每個緩存的值在每個機器上。為了使用這個特性,把所有的服務地址放在LOCATION里面,用分號隔開或者當做一個list。
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] } }
(2)Databasecache
Django 可以把緩存保存在你的數據庫里。如果你有一個快速的、專業的數據庫服務器的話那這種方式是效果最好的。
為了把數據表用來當做你的緩存后臺:
把BACKEND設置為django.core.cache.backends.db.DatabaseCache
把 LOCATION 設置為 tablename, 數據表的名稱。這個名字可以是任何你想要的名字,只要它是一個合法的表名并且在你的數據庫中沒有被使用過。
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', } }
但是在使用之前要創建一個緩存表
python manage.py createcachetable
如果你使用多數據庫緩存, createcachetable會在每個緩存中創建一個表。
如果你使用多數據庫,createcachetable會遵循你的數據庫路由中的allow_migrate()方法
像migrate, createcachetable 這樣的命令不會碰觸現有的表。它只創建非現有的表。
(3)文件系統緩存
基于文件的緩存后端序列化和存儲每個緩存值作為一個單獨的文件。 為了使用這個文件緩存,你要設置BACKEND為 "django.core.cache.backends.filebased.FileBasedCache" 并且 LOCATION 設置為一個合適的目錄。例如,把緩存儲存在 /var/tmp/django_cache,就用這個設置:
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', } }
路徑應該是絕對路徑– 也就是說,要從你的系統路徑開始算。你在末尾添加不添加斜杠都是無所謂的。
請確保,你的路徑指向是存在的并且,這個路徑下 你有系統用戶的足夠的讀,寫權限。繼續上面的例子,如果你是一個 名叫apache用戶,確保 /var/tmp/django_cache這個路徑存在并且apache有讀和寫的權力。
(4)本地緩存
這是默認的緩存,如果你不在指定其他的緩存設置。如果你想要具有高速這個有點的基于內存的緩存但是又沒有能力帶動 Memcached, 那就考慮一下本地緩存吧。
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', } }
二、cache參數
上面的django的setting文件里的CACHES參數還可以設置一些其它的參數,如下:
TIMEOUT:緩存的默認過期時間,以秒為單位, 這個參數默認是 300 seconds (5 分鐘).
當設置為 None 的時候,緩存默認永遠不會過期。值設置成0造成緩存立即失效(緩存就沒有意義了)。
OPTIONS: 這個參數應該被傳到緩存后端。有效的可選項列表根據緩存的后端不同而不同,由第三方庫所支持的緩存將會把這些選項直接配置到底層的緩存庫。
緩存的后端實現自己的選擇策略 將會履行下面這些選項:
MAX_ENTRIES:高速緩存允許的最大條目數,超出這個數則舊值將被刪除. 這個參數默認是300.
CULL_FREQUENCY:當達到MAX_ENTRIES 的時候,被刪除的條目比率。 實際比率是 1 / CULL_FREQUENCY, 所以設置CULL_FREQUENCY 為2會在達到MAX_ENTRIES 所設置值時刪去一半的緩存。這個參數應該是整數,默認為 3.
把 CULL_FREQUENCY的值設置為 0 意味著當達到MAX_ENTRIES時,緩存將被清空。某些緩存后端 (database尤其)這將以很多緩存丟失為代價,大大提高接受訪問的速度。
KEY_PREFIX:一個字符串,它將自動包括 (默認預置) 到 Django 服務器所使用的所有緩存密鑰
VERSION:由 Django 服務器生成的緩存鍵的默認版本號
KEY_FUNCTION:包含一個函數,定義了如何將組合成一個最后的緩存鍵的前綴、 版本和鍵虛線的路徑的字符串
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', 'TIMEOUT': 60, 'OPTIONS': { 'MAX_ENTRIES': 1000 } }}
上面的例子是一個文件系統緩存后端,緩存過期時間被設置為60秒,最大條目為1000。非法的參數將會被系統自動忽視掉。
緩存的知識就介紹到這里,很晚了,明天再接著介紹緩存的使用吧,以上知識僅供參考,也許寫的不夠好,但知識最重要的還是應用,只有應用的時候才能慢慢體會它的原理以及精妙之處。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。