Python--Redis實戰:第二章:使用Redis構建Web應用:第三節:網頁緩存

上一篇文章: Python--Redis實戰:第二章:使用Redis構建Web應用:第二節:使用Redis實現購物車
下一篇文章: Python--Redis實戰:第二章:使用Redis構建Web應用:第四節:數據行緩存

在動態生成網頁的時候,一般會使用模板語言【templating language】來簡化網頁的生成操做。須要手寫每一個頁面的日子已經一去不復返:如今的Web頁面一般由包含首部、尾部、側欄菜單、工具條、內容域的模板生成,有時候模板還用於生成JavaScript。數據庫

儘管【Fake Web Retailer】也可以動態地生成內容,但這個網站上的不少頁面實際上並不會常常發生大的變化:雖然會向分類中添加新商品、移除舊商品、有時有特價促銷、有時甚至還有【熱賣商品】頁面,可是在通常狀況下,網站只有帳號設置、以往訂單、購物車【結帳信息】以及其餘少數幾個頁面才包含須要每次載入都要動態生成的內容。segmentfault

假設:經過對瀏覽數據進行分析,咱們發現咱們網站所處理的95%的Web頁面天天最多隻會改變一次,這些頁面的內容實際上並不須要動態生成,而咱們的工做就是想辦法再也不生產這些頁面。減小網站的動態生成內容上面所花的時間,能夠下降網站處理相同負載所需的服務器數量,並讓網站的速度變得更快。【研究代表,減小用戶等待頁面載入的時間,能夠增長用戶使用網站的慾望,並改善用戶對網站的印象。】緩存

全部標準的Python應用框架都提供了在處理請求以前或者以後添加層【layer】的能力,這些層同城被稱爲中間件【middleware】或者插件【plugin】。咱們將建立一個這樣的層來調用Redis緩存函數:對於一個不能被緩存的請求,函數將直接生成並返回頁面;而對於能夠被緩存的請求,函數首先嚐試從緩存裏面取出並返回被緩存的頁面,若是緩存頁面不存在,那麼函數會生成頁面並將其緩存在Redis裏面5分鐘,最後再將頁面返回給調用者。服務器

def cache_request(conn,request,callback):
    if not can_cache(conn,request):
        #對於不能被緩存的請求,直接調用毀掉函數
        return callback(request)
    #將請求轉換成一個簡單的字符串建,方便以後進行查找
    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

對於咱們的網站上面95%的可被緩存而且頻繁被載入的內容來講,上面緩存函數可讓網站在5分鐘以內無須再爲它們動態生成視圖頁面。取決於網頁的內容有多複雜,這一改動能夠將包含大量數據的頁面的延遲值從20~50毫秒下降至查詢一次Redis所需的時間:查詢本地Redis的延遲值一般低於1毫秒,而查詢位於同一數據中心的Redis的延時值一般低於5毫秒。對於那麼須要訪問數據庫的頁面來講,這個緩存函數對於減小頁面載入時間和下降數據庫負載的做用會更加顯著。框架

在這一節中,咱們學習瞭如何使用Redis來減小載入不常該表頁面所需的時間,那麼對於那些常常發生變化的頁面,咱們是否也可以使用Redis來減小他們的載入時間呢?函數

答案是確定的,接下來咱們將介紹實現這一目標的具體作法。工具

上一篇文章: Python--Redis實戰:第二章:使用Redis構建Web應用:第二節:使用Redis實現購物車
下一篇文章: Python--Redis實戰:第二章:使用Redis構建Web應用:第四節:數據行緩存
相關文章
相關標籤/搜索