淺析Python的Django框架中的Memcached
動(dòng)態(tài)網(wǎng)站的問(wèn)題就在于它是動(dòng)態(tài)的。 也就是說(shuō)每次用戶訪問(wèn)一個(gè)頁(yè)面,服務(wù)器要執(zhí)行數(shù)據(jù)庫(kù)查詢,啟動(dòng)模板,執(zhí)行業(yè)務(wù)邏輯以及最終生成一個(gè)你所看到的網(wǎng)頁(yè),這一切都是動(dòng)態(tài)即時(shí)生成的。 從處理器資源的角度來(lái)看,這是比較昂貴的。
對(duì)于大多數(shù)網(wǎng)絡(luò)應(yīng)用來(lái)說(shuō),過(guò)載并不是大問(wèn)題。 因?yàn)榇蠖鄶?shù)網(wǎng)絡(luò)應(yīng)用并不是washingtonpost.com或Slashdot;它們通常是很小很簡(jiǎn)單,或者是中等規(guī)模的站點(diǎn),只有很少的流量。 但是對(duì)于中等至大規(guī)模流量的站點(diǎn)來(lái)說(shuō),盡可能地解決過(guò)載問(wèn)題是非常必要的。
這就需要用到緩存了。
緩存的目的是為了避免重復(fù)計(jì)算,特別是對(duì)一些比較耗時(shí)間、資源的計(jì)算。 下面的偽代碼演示了如何對(duì)動(dòng)態(tài)頁(yè)面的結(jié)果進(jìn)行緩存。
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提供了一個(gè)穩(wěn)定的緩存系統(tǒng)讓你緩存動(dòng)態(tài)頁(yè)面的結(jié)果,這樣在接下來(lái)有相同的請(qǐng)求就可以直接使用緩存中的數(shù)據(jù),避免不必要的重復(fù)計(jì)算。 另外Django還提供了不同粒度數(shù)據(jù)的緩存,例如: 你可以緩存整個(gè)頁(yè)面,也可以緩存某個(gè)部分,甚至緩存整個(gè)網(wǎng)站。
Django也和”上游”緩存工作的很好,例如Squid(http://www.squid-cache.org)和基于瀏覽器的緩存。 這些類型的緩存你不直接控制,但是你可以提供關(guān)于你的站點(diǎn)哪部分應(yīng)該被緩存和怎樣緩存的線索(通過(guò)HTTP頭部)給它們
設(shè)定緩存
緩存系統(tǒng)需要一些少量的設(shè)定工作。 也就是說(shuō),你必須告訴它緩存的數(shù)據(jù)應(yīng)該放在哪里,在數(shù)據(jù)庫(kù)中,在文件系統(tǒng),或直接在內(nèi)存中。 這是一個(gè)重要的決定,影響您的高速緩存的性能,是的,有些類型的緩存比其它類型快。
緩存設(shè)置在settings文件的 CACHE_BACKEND中。 這里是一個(gè)CACHE_BACKEND所有可用值的解釋。
內(nèi)存緩沖
Memcached是迄今為止可用于Django的最快,最有效的緩存類型,Memcached是完全基于內(nèi)存的緩存框架,最初開(kāi)發(fā)它是用以處理高負(fù)荷的LiveJournal.com隨后由Danga Interactive公司開(kāi)源。 它被用于一些站點(diǎn),例如Facebook和維基百科網(wǎng)站,以減少數(shù)據(jù)庫(kù)訪問(wèn),并大幅提高站點(diǎn)的性能。
Memcached是免費(fèi)的(http://danga.com/memcached)。它作為一個(gè)守護(hù)進(jìn)程運(yùn)行,并分配了特定數(shù)量的內(nèi)存。 它只是提供了添加,檢索和刪除緩存中的任意數(shù)據(jù)的高速接口。 所有數(shù)據(jù)都直接存儲(chǔ)在內(nèi)存中,所以沒(méi)有對(duì)使用的數(shù)據(jù)庫(kù)或文件系統(tǒng)的開(kāi)銷。
在安裝了Memcached本身之后,你將需要安裝Memcached Python綁定,它沒(méi)有直接和Django綁定。 這兩個(gè)可用版本。 選擇和安裝以下模塊之一:
最快的可用選項(xiàng)是一個(gè)模塊,稱為cmemcache,在http://gijsbert.org/cmemcache。
如果您無(wú)法安裝cmemcache,您可以安裝python - Memcached,在ftp://ftp.tummy.com/pub/python-memcached/。如果該網(wǎng)址已不再有效,只要到Memcached的網(wǎng)站http://www.danga.com/memcached/),并從客戶端API完成Python綁定。
若要使用Memcached的Django,設(shè)置CACHE_BACKEND到memcached:/ / IP:port/,其中IP是Memcached的守護(hù)進(jìn)程的IP地址,port是Memcached運(yùn)行的端口。
在這個(gè)例子中,Memcached運(yùn)行在本地主機(jī) (127.0.0.1)上,端口為11211:
CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
Memcached的一個(gè)極好的特性是它在多個(gè)服務(wù)器間分享緩存的能力。 這意味著您可以在多臺(tái)機(jī)器上運(yùn)行Memcached的守護(hù)進(jìn)程,該程序會(huì)把這些機(jī)器當(dāng)成一個(gè)單一緩存,而無(wú)需重復(fù)每臺(tái)機(jī)器上的緩存值。 要充分利用此功能,請(qǐng)?jiān)贑ACHE_BACKEND里引入所有服務(wù)器的地址,用分號(hào)分隔。
這個(gè)例子中,緩存在運(yùn)行在IP地址為172.19.26.240和172.19.26.242,端口號(hào)為11211的Memcached實(shí)例間分享:
CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11211/'
這個(gè)例子中,緩存在運(yùn)行在172.19.26.240(端口11211),172.19.26.242(端口11212),172.19.26.244(端口11213)的Memcached實(shí)例間分享:
CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11212;172.19.26.244:11213/'
最后有關(guān)Memcached的一點(diǎn)是,基于內(nèi)存的緩存有一個(gè)重大的缺點(diǎn)。 由于緩存的數(shù)據(jù)存儲(chǔ)在內(nèi)存中,所以如果您的服務(wù)器崩潰,數(shù)據(jù)將會(huì)消失。 顯然,內(nèi)存不是用來(lái)持久化數(shù)據(jù)的,因此不要把基于內(nèi)存的緩存作為您唯一的存儲(chǔ)數(shù)據(jù)緩存。 毫無(wú)疑問(wèn),在Django的緩存后端不應(yīng)該用于持久化,它們本來(lái)就被設(shè)計(jì)成緩存的解決方案。但我們?nèi)匀恢赋龃它c(diǎn),這里是因?yàn)榛趦?nèi)存的緩存是暫時(shí)的。
相關(guān)文章
python爬蟲實(shí)戰(zhàn)項(xiàng)目之爬取pixiv圖片
最近決定寫個(gè)P站的爬蟲,實(shí)際操作起來(lái)確實(shí)遇到了些新問(wèn)題,通過(guò)解決也有所收獲,下面這篇文章主要給大家介紹了關(guān)于python爬蟲實(shí)戰(zhàn)項(xiàng)目之爬取pixiv圖片的相關(guān)資料,需要的朋友可以參考下2022-07-07對(duì)python實(shí)現(xiàn)二維函數(shù)高次擬合的示例詳解
今天小編就為大家分享一篇對(duì)python實(shí)現(xiàn)二維函數(shù)高次擬合的示例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Jupyter?Notebook出現(xiàn)不是內(nèi)部或外部的命令解決方案
這篇文章主要介紹了Jupyter?Notebook出現(xiàn)不是內(nèi)部或外部的命令解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06純numpy數(shù)值微分法實(shí)現(xiàn)手寫數(shù)字識(shí)別
本文主要介紹了純numpy數(shù)值微分法實(shí)現(xiàn)手寫數(shù)字識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08教你利用Python玩轉(zhuǎn)histogram直方圖的五種方法
這篇文章主要給大家介紹了關(guān)于如何利用Python玩轉(zhuǎn)histogram直方圖的五種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07Python十類常見(jiàn)異常類型總結(jié)(附捕獲及異常處理方式)
在編寫程序時(shí)難免會(huì)遇到錯(cuò)誤,有的是編寫人員疏忽造成的語(yǔ)法錯(cuò)誤,有的是程序內(nèi)部隱含邏輯問(wèn)題造成的數(shù)據(jù)錯(cuò)誤等等,這篇文章主要給大家介紹了關(guān)于Python十類常見(jiàn)異常類型總結(jié)的相關(guān)資料,文中還附捕獲及異常處理方式,需要的朋友可以參考下2023-06-06Python入門教程(十九)python的函數(shù)詳解
這篇文章主要介紹了Python入門教程(十九)python的函數(shù),函數(shù)是組織好的,可重復(fù)使用的,用來(lái)實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段,需要的朋友可以參考下2023-04-04