成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python--Redis實(shí)戰(zhàn):第二章:使用Redis構(gòu)建Web應(yīng)用:第五節(jié):網(wǎng)頁(yè)分析

rubyshen / 2140人閱讀

摘要:每個(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

相關(guān)文章

  • Python--Redis實(shí)戰(zhàn)二章使用Redis構(gòu)建Web應(yīng)用:第四節(jié):數(shù)據(jù)行緩存

    摘要:實(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)用:第...

    TwIStOy 評(píng)論0 收藏0
  • Python--Redis實(shí)戰(zhàn):第三章:Redis命令:第一節(jié):字符串

    摘要:對(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里...

    HelKyle 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<