摘要:研究表明,減少用戶等待頁面載入的時間,可以增加用戶使用網(wǎng)站的欲望,并改善用戶對網(wǎng)站的印象。上一篇文章實戰(zhàn)第二章使用構(gòu)建應(yīng)用第二節(jié)使用實現(xiàn)購物車下一篇文章實戰(zhàn)第二章使用構(gòu)建應(yīng)用第四節(jié)數(shù)據(jù)行緩存
上一篇文章: Python--Redis實戰(zhàn):第二章:使用Redis構(gòu)建Web應(yīng)用:第二節(jié):使用Redis實現(xiàn)購物車
下一篇文章:Python--Redis實戰(zhàn):第二章:使用Redis構(gòu)建Web應(yīng)用:第四節(jié):數(shù)據(jù)行緩存
在動態(tài)生成網(wǎng)頁的時候,通常會使用模板語言【templating language】來簡化網(wǎng)頁的生成操作。需要手寫每個頁面的日子已經(jīng)一去不復(fù)返:現(xiàn)在的Web頁面通常由包含首部、尾部、側(cè)欄菜單、工具條、內(nèi)容域的模板生成,有時候模板還用于生成JavaScript。
盡管【Fake Web Retailer】也能夠動態(tài)地生成內(nèi)容,但這個網(wǎng)站上的很多頁面實際上并不會經(jīng)常發(fā)生大的變化:雖然會向分類中添加新商品、移除舊商品、有時有特價促銷、有時甚至還有【熱賣商品】頁面,但是在一般情況下,網(wǎng)站只有賬號設(shè)置、以往訂單、購物車【結(jié)賬信息】以及其他少數(shù)幾個頁面才包含需要每次載入都要動態(tài)生成的內(nèi)容。
假設(shè):通過對瀏覽數(shù)據(jù)進行分析,我們發(fā)現(xiàn)我們網(wǎng)站所處理的95%的Web頁面每天最多只會改變一次,這些頁面的內(nèi)容實際上并不需要動態(tài)生成,而我們的工作就是想辦法不再生產(chǎn)這些頁面。減少網(wǎng)站的動態(tài)生成內(nèi)容上面所花的時間,可以降低網(wǎng)站處理相同負載所需的服務(wù)器數(shù)量,并讓網(wǎng)站的速度變得更快。【研究表明,減少用戶等待頁面載入的時間,可以增加用戶使用網(wǎng)站的欲望,并改善用戶對網(wǎng)站的印象。】
所有標準的Python應(yīng)用框架都提供了在處理請求之前或者之后添加層【layer】的能力,這些層同城被稱為中間件【middleware】或者插件【plugin】。我們將創(chuàng)建一個這樣的層來調(diào)用Redis緩存函數(shù):對于一個不能被緩存的請求,函數(shù)將直接生成并返回頁面;而對于可以被緩存的請求,函數(shù)首先嘗試從緩存里面取出并返回被緩存的頁面,如果緩存頁面不存在,那么函數(shù)會生成頁面并將其緩存在Redis里面5分鐘,最后再將頁面返回給調(diào)用者。
def cache_request(conn,request,callback): if not can_cache(conn,request): #對于不能被緩存的請求,直接調(diào)用毀掉函數(shù) return callback(request) #將請求轉(zhuǎn)換成一個簡單的字符串建,方便之后進行查找 page_key="cache:"+hash_request(request) #嘗試查找被緩存的頁面 content=conn.get(page_key) if not content: #如果頁面沒有被緩存,那么生成頁面 content=callback(request) #將新生成的頁面存放到緩存里面 conn.setex(page_key,content,300) return content
對于我們的網(wǎng)站上面95%的可被緩存并且頻繁被載入的內(nèi)容來說,上面緩存函數(shù)可以讓網(wǎng)站在5分鐘之內(nèi)無須再為它們動態(tài)生成視圖頁面。取決于網(wǎng)頁的內(nèi)容有多復(fù)雜,這一改動可以將包含大量數(shù)據(jù)的頁面的延遲值從20~50毫秒降低至查詢一次Redis所需的時間:查詢本地Redis的延遲值通常低于1毫秒,而查詢位于同一數(shù)據(jù)中心的Redis的延時值通常低于5毫秒。對于那么需要訪問數(shù)據(jù)庫的頁面來說,這個緩存函數(shù)對于減少頁面載入時間和降低數(shù)據(jù)庫負載的作用會更加顯著。
在這一節(jié)中,我們學(xué)習(xí)了如何使用Redis來減少載入不常該表頁面所需的時間,那么對于那些經(jīng)常發(fā)生變化的頁面,我們是否也能夠使用Redis來減少他們的載入時間呢?
答案是肯定的,接下來我們將介紹實現(xiàn)這一目標的具體做法。
上一篇文章: Python--Redis實戰(zhàn):第二章:使用Redis構(gòu)建Web應(yīng)用:第二節(jié):使用Redis實現(xiàn)購物車
下一篇文章:Python--Redis實戰(zhàn):第二章:使用Redis構(gòu)建Web應(yīng)用:第四節(jié):數(shù)據(jù)行緩存
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42564.html
摘要:為了防止用戶對同一篇文章進行多次投票,網(wǎng)站需要為每一篇文章記錄一個已投票用戶名單。上一篇文章實戰(zhàn)第一章初識第二節(jié)數(shù)據(jù)結(jié)構(gòu)簡介下一篇文章實戰(zhàn)第二章使用構(gòu)建應(yīng)用第一節(jié)登錄和緩存 上一篇文章: Python--Redis實戰(zhàn):第一章:初識Redis:第二節(jié):Redis數(shù)據(jù)結(jié)構(gòu)簡介下一篇文章:Python--Redis實戰(zhàn):第二章:使用Redis構(gòu)建Web應(yīng)用:第一節(jié):登錄和cookie緩存 ...
摘要:實際執(zhí)行緩存操作的函數(shù)需要用到數(shù)據(jù)行的延遲值,如果某個數(shù)據(jù)行的延遲值不存在,那么程序?qū)⑷∠麑@個數(shù)據(jù)行的調(diào)度。上一篇文章實戰(zhàn)第二章使用構(gòu)建應(yīng)用第三節(jié)網(wǎng)頁緩存下一篇文章實戰(zhàn)第二章使用構(gòu)建應(yīng)用第五節(jié)網(wǎng)頁分析 上一篇文章: Python--Redis實戰(zhàn):第二章:使用Redis構(gòu)建Web應(yīng)用:第三節(jié):網(wǎng)頁緩存下一篇文章:Python--Redis實戰(zhàn):第二章:使用Redis構(gòu)建Web應(yīng)用:第...
閱讀 2396·2021-11-24 10:26
閱讀 2586·2021-11-16 11:44
閱讀 1704·2021-09-22 15:26
閱讀 3583·2021-09-10 11:11
閱讀 3191·2021-09-07 10:25
閱讀 3631·2021-09-01 10:41
閱讀 1014·2021-08-27 13:11
閱讀 3513·2021-08-16 11:02