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