Python--Redis實戰:第二章:使用Redis構建Web應用:第五節:網頁分析

上一篇文章: Python--Redis實戰:第二章:使用Redis構建Web應用:第四節:數據行緩存
下一篇文章: Python--Redis實戰:第三章:Redis命令:第一節:字符串

網站能夠從用戶的訪問、交互、購買行爲中收集到有價值的信息。例如:若是咱們只想關注那些瀏覽量最高的頁面,那麼咱們能夠嘗試修改頁面的格局、配色甚至是頁面上展現的其餘連接。每個修改嘗試都能改變用戶對一個頁面或者後續頁面的體驗,或好或壞,甚至還能影響用戶的購買行爲。web

前面介紹了若是記錄用戶瀏覽過的商品或者用戶添加到購物車中的商品、如何經過緩存web頁面來減小頁面載入時間並提高頁面的響應速度。不過遺憾的是,咱們對咱們的網站作的過了火:咱們網站總共包含100 000件商品,而冒然的緩存全部商品頁面將耗盡整個網站的所有內存!通過一番調研以後,咱們決定只對其中10 000件商品的頁面進行緩存。數據庫

前面曾經介紹過,每一個用戶都有一個相應的記錄用戶瀏覽商品歷史的有序集合,儘管使用這些有序集合能夠計算出用戶最近瀏覽的商品,但進行這種計算卻須要消耗大量的時間。爲了解決這個問題,咱們決定在update_token()函數裏面添加一行代碼:segmentfault

#更新令牌
import time
def update_token(conn,token,user,item=None):
    timestamp=time.time() #h獲取當前時間戳
    conn.hset('login:',token,user) #維持令牌與已登錄用戶之間的映射
    conn.zadd('recent:',token,timestamp) #記錄領哦哎最後一次出現的時間
    if item:
        conn.zadd('viewed:'+token,item,timestamp) #記錄用戶瀏覽郭的商品
        conn.zremrangebyrank('viewed:'+token,0,-26) #移除舊的記錄,值保留用戶最近瀏覽過的25個商品
        #新增下面一行代碼
        conn.zincrby('viewed:',item,-1)

新增長的代碼記錄了全部商品的瀏覽次數,並根據瀏覽次數對商品進行了排序,被瀏覽得最多的商品將被放到有序集合的索引0位置上,而且具備整個有序集合最少的分值。隨着時間的流逝,商品的瀏覽次數會呈現兩極分化的狀態,一些商品的瀏覽次數愈來愈多,而另外一些商品的瀏覽次數則愈來愈少。除了緩存最常被瀏覽得商品以外,程序還須要發現那些變得愈來愈流行的新商品,並在合適的時候緩存他們。緩存

爲了讓商品瀏覽次數排行榜可以保持最新,咱們須要按期修剪有序集合的長度並調整已有元素的分值,從而使得新流行的商品也能夠在排行榜裏面佔據一席之地。以前已經介紹過從有序集合裏面移除元素的方法,而調整元素分值的動做則能夠經過zinterstore命令來完成。zinterstore命令能夠組合起一個或多個有序集合,並將有序集合包含的每一個分值都乘以一個給定的數值【用戶能夠爲每一個有序集合分別指定不一樣的相乘數值】。每一個5分值,函數就會刪除全部排名在20 000名以後的商品,並將刪除以後剩餘的全部商品的瀏覽次數減半。服務器

def rescale_viewed(conn):
    while not QUIT:
        #刪除全部排名在20 000名以後的商品
        conn.zremrangebyrank('viewed:',0,-20001)
        #將瀏覽次數下降爲原來的一半
        conn.zinterstore('viewed:',{'viewed:':.5})
        #5分鐘以後再次執行該操做
        time.sleep(300)

經過記錄商品的瀏覽次數,並按期對記錄瀏覽次數的有序集合進行修剪和分值調整,咱們爲咱們的網站創建起了一個持續更新的最常瀏覽商品的排行榜。ide

#判斷頁面是否須要被緩存
def can_cache(conn,request):
    #嘗試從頁面裏面取出商品ID
    item_id=extract_item_id(request)
    #檢查這個頁面可否額比緩存以及這個頁面是否爲商品頁面
    if not item_id or is_dynamic(request):
        return False
    #取得商品的瀏覽次數排名
    rank=conn.zrank('viewed:',item_id)
    #根據商品的瀏覽次數排名來判斷是否須要緩存這個頁面
    return rank is not None and rank<10000

經過使用前面介紹的幾個函數,咱們的網站如今能夠統計商品被瀏覽的次數,並以此來緩存用戶常常瀏覽的10 000個商品頁面。若是咱們想以最少的代價來存儲更多的頁面,那麼能夠考慮先對頁面進行壓縮,而後再緩存到Redis裏面;或者使用【Edge Side Includes】計數移除頁面中的部份內容;又或者對模板進行提早優化【pre-optimize】,移除全部非必要的空格字符。這些技術可以減小內存消耗並增長Redis可以緩存的頁面數量,爲訪問量不斷增加的網站帶來額外的性能提高。函數

本章小結

本章介紹了幾種用於下降網站數據庫負載和Web服務器負載的方法,這些例子裏面介紹的都是真實的Web應用程序當今正在使用的思路和方法。性能

上一篇文章: Python--Redis實戰:第二章:使用Redis構建Web應用:第四節:數據行緩存
下一篇文章: Python--Redis實戰:第三章:Redis命令:第一節:字符串
相關文章
相關標籤/搜索