摘要:每個分值,函數(shù)就會刪除所有排名在名之后的商品,并將刪除之后剩余的所有商品的瀏覽次數(shù)減半。上一篇文章實戰(zhàn)第二章使用構建應用第四節(jié)數(shù)據(jù)行緩存下一篇文章實戰(zhàn)第三章命令第一節(jié)字符串
上一篇文章:Python--Redis實戰(zhàn):第二章:使用Redis構建Web應用:第四節(jié):數(shù)據(jù)行緩存
下一篇文章:Python--Redis實戰(zhàn):第三章:Redis命令:第一節(jié):字符串
網站可以從用戶的訪問、交互、購買行為中收集到有價值的信息。例如:如果我們只想關注那些瀏覽量最高的頁面,那么我們可以嘗試修改頁面的格局、配色甚至是頁面上展示的其他鏈接。每一個修改嘗試都能改變用戶對一個頁面或者后續(xù)頁面的體驗,或好或壞,甚至還能影響用戶的購買行為。
前面介紹了如果記錄用戶瀏覽過的商品或者用戶添加到購物車中的商品、如何通過緩存web頁面來減少頁面載入時間并提升頁面的響應速度。不過遺憾的是,我們對我們的網站做的過了火:我們網站總共包含100 000件商品,而冒然的緩存所有商品頁面將耗盡整個網站的全部內存!經過一番調研之后,我們決定只對其中10 000件商品的頁面進行緩存。
前面曾經介紹過,每個用戶都有一個相應的記錄用戶瀏覽商品歷史的有序集合,盡管使用這些有序集合可以計算出用戶最近瀏覽的商品,但進行這種計算卻需要消耗大量的時間。為了解決這個問題,我們決定在update_token()函數(shù)里面添加一行代碼:
#更新令牌 import time def update_token(conn,token,user,item=None): timestamp=time.time() #h獲取當前時間戳 conn.hset("login:",token,user) #維持令牌與已登陸用戶之間的映射 conn.zadd("recent:",token,timestamp) #記錄領哦哎最后一次出現(xiàn)的時間 if item: conn.zadd("viewed:"+token,item,timestamp) #記錄用戶瀏覽郭的商品 conn.zremrangebyrank("viewed:"+token,0,-26) #移除舊的記錄,值保留用戶最近瀏覽過的25個商品 #新增下面一行代碼 conn.zincrby("viewed:",item,-1)
新增加的代碼記錄了所有商品的瀏覽次數(shù),并根據(jù)瀏覽次數(shù)對商品進行了排序,被瀏覽得最多的商品將被放到有序集合的索引0位置上,并且具有整個有序集合最少的分值。隨著時間的流逝,商品的瀏覽次數(shù)會呈現(xiàn)兩極分化的狀態(tài),一些商品的瀏覽次數(shù)越來越多,而另一些商品的瀏覽次數(shù)則越來越少。除了緩存最常被瀏覽得商品之外,程序還需要發(fā)現(xiàn)那些變得越來越流行的新商品,并在合適的時候緩存他們。
為了讓商品瀏覽次數(shù)排行榜能夠保持最新,我們需要定期修剪有序集合的長度并調整已有元素的分值,從而使得新流行的商品也可以在排行榜里面占據(jù)一席之地。之前已經介紹過從有序集合里面移除元素的方法,而調整元素分值的動作則可以通過zinterstore命令來完成。zinterstore命令可以組合起一個或多個有序集合,并將有序集合包含的每個分值都乘以一個給定的數(shù)值【用戶可以為每個有序集合分別指定不同的相乘數(shù)值】。每個5分值,函數(shù)就會刪除所有排名在20 000名之后的商品,并將刪除之后剩余的所有商品的瀏覽次數(shù)減半。
def rescale_viewed(conn): while not QUIT: #刪除所有排名在20 000名之后的商品 conn.zremrangebyrank("viewed:",0,-20001) #將瀏覽次數(shù)降低為原來的一半 conn.zinterstore("viewed:",{"viewed:":.5}) #5分鐘之后再次執(zhí)行該操作 time.sleep(300)
通過記錄商品的瀏覽次數(shù),并定期對記錄瀏覽次數(shù)的有序集合進行修剪和分值調整,我們?yōu)槲覀兊木W站建立起了一個持續(xù)更新的最常瀏覽商品的排行榜。
#判斷頁面是否需要被緩存 def can_cache(conn,request): #嘗試從頁面里面取出商品ID item_id=extract_item_id(request) #檢查這個頁面能否額比緩存以及這個頁面是否為商品頁面 if not item_id or is_dynamic(request): return False #取得商品的瀏覽次數(shù)排名 rank=conn.zrank("viewed:",item_id) #根據(jù)商品的瀏覽次數(shù)排名來判斷是否需要緩存這個頁面 return rank is not None and rank<10000
通過使用前面介紹的幾個函數(shù),我們的網站現(xiàn)在可以統(tǒng)計商品被瀏覽的次數(shù),并以此來緩存用戶經常瀏覽的10 000個商品頁面。如果我們想以最少的代價來存儲更多的頁面,那么可以考慮先對頁面進行壓縮,然后再緩存到Redis里面;或者使用【Edge Side Includes】計數(shù)移除頁面中的部分內容;又或者對模板進行提前優(yōu)化【pre-optimize】,移除所有非必要的空格字符。這些技術能夠減少內存消耗并增加Redis能夠緩存的頁面數(shù)量,為訪問量不斷增長的網站帶來額外的性能提升。
本章小結本章介紹了幾種用于降低網站數(shù)據(jù)庫負載和Web服務器負載的方法,這些例子里面介紹的都是真實的Web應用程序當今正在使用的思路和方法。
上一篇文章:Python--Redis實戰(zhàn):第二章:使用Redis構建Web應用:第四節(jié):數(shù)據(jù)行緩存
下一篇文章:Python--Redis實戰(zhàn):第三章:Redis命令:第一節(jié):字符串
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42588.html
摘要:實際執(zhí)行緩存操作的函數(shù)需要用到數(shù)據(jù)行的延遲值,如果某個數(shù)據(jù)行的延遲值不存在,那么程序將取消對這個數(shù)據(jù)行的調度。上一篇文章實戰(zhàn)第二章使用構建應用第三節(jié)網頁緩存下一篇文章實戰(zhàn)第二章使用構建應用第五節(jié)網頁分析 上一篇文章: Python--Redis實戰(zhàn):第二章:使用Redis構建Web應用:第三節(jié):網頁緩存下一篇文章:Python--Redis實戰(zhàn):第二章:使用Redis構建Web應用:第...
摘要:對字符串執(zhí)行自增和自減操作的實例導入包包與本地進行鏈接,地址為,端口號為嘗試獲取一個不存在的鍵將得到一個值。上一篇文章實戰(zhàn)第二章使用構建應用第五節(jié)網頁分析下一篇文章實戰(zhàn)第三章命令第二節(jié)列表 上一篇文章: Python--Redis實戰(zhàn):第二章:使用Redis構建Web應用:第五節(jié):網頁分析下一篇文章:Python--Redis實戰(zhàn):第三章:Redis命令:第二節(jié):列表 在Redis里...
閱讀 3834·2021-09-27 13:56
閱讀 881·2021-09-08 09:36
閱讀 765·2019-08-30 15:54
閱讀 609·2019-08-29 17:29
閱讀 927·2019-08-29 17:21
閱讀 1683·2019-08-29 16:59
閱讀 2757·2019-08-29 13:03
閱讀 2964·2019-08-29 12:47