上一篇文章: Python--Redis實戰:第二章:使用Redis構建Web應用:第一節:登陸和cookie緩存
下一篇文章: Python--Redis實戰:第二章:使用Redis構建Web應用:第三節:網頁緩存
網景(Netscape)公司在20世紀90年代中期最早在網絡中使用了cookie,這些cookie最終變成了咱們如今使用的cookie。cookie最初的意圖是在於爲網絡銷售商提供一種購物車,讓用戶能夠收集他們想要購買的商品。前端
使用cookie實現購物車:也就是將整個購物車都存儲到cookie裏面的作法很是常見,這種作法的一大優勢是無須對數據庫進行寫入就能夠實現購物車功能,而缺點則是程序須要從新解析和驗證(validata)cookie,確保cookie的格式正確,而且包含的商品都是真正可購買的商品。cookie購物車還有一個缺點:由於瀏覽器每次發送請求都會連cookie一塊兒發送,因此若是購物車cookie的體積比較大,那麼請求發送和處理的速度可能會有所下降。web
由於咱們在簽名已經使用了Redis實現了會話cookie和記錄用戶最近瀏覽過的商品這兩個特性,因此咱們決定將購物車的信息也存儲到Redis裏面,而且使用與會話cookie相同的cookieID來引用購物車。數據庫
購物車的定義很是簡單:每一個用戶的購物車都是一個散列,這個散列存儲了商品ID與商品訂購數量之間的映射。對商品數量進行驗證的工做有web應用程序負責,咱們要作的則是在商品的訂購數量出現變化時,對購物車進行更新:若是用戶訂購某件商品的數量大於0,那麼程序會將這件商品的ID以及用戶訂購該商品的數量添加到散列裏面,若是用戶購買的商品以及存在於散列裏面,那麼新的訂購數量會覆蓋已有的訂購數量;相反的,若是用戶訂購某件商品的數量不大於0,那麼程序將從散列裏面移除該條目。segmentfault
def add_to_cart(conn,session,item,count): if count<=0: #從購物車裏面移除指定商品 conn.hrem('cart:'+session,item) else: #將指定的商品添加到購物車🛒 conn.hset('cart:'+session,item,count)
接着,咱們須要對以前的會話清理函數進行更新,讓它在清理會話的同時,將舊會話對應用戶的購物車也一併刪除:瀏覽器
#清理舊會話 import time QUIT=False LIMIT=10,000,000 def clean_sessions(conn): while not QUIT: #目前已有令牌的數量 size=conn.zcard('recent:') if size<=LIMIT: #令牌數量未超過限制,休眠1秒後再從新檢查 time.sleep(1) continue end_index=min(size-LIMIT,100) tokens=conn.zrange('recent:',0,end_index-1) session_keys=[] #爲那些將要刪除的令牌構建鍵名 for token in tokens: session_keys.append('viewed:'+token) #新增下面有一行代碼用於刪除舊會話對應用戶的購物車 session_keys.append('cart:'+token) #移除最舊的那些令牌 conn.delete(*session_keys) conn.hdel('login:',*tokens) conn.zrem('recent:',*tokens)
咱們如今講會話和購物車都存儲到了Redis裏面,這種作法除了能夠減小請求的體積以外,還使得咱們能夠根據用戶瀏覽過的商品、用戶放入購物車的商品以及用戶最終購買的商品進行統計計算,並構建起不少大型網絡零售商都在提供的【在查看過這件商品的用戶當中,有X%的用戶最終購買了 這件商品】、【購買了這件商品的用戶也購買了XXX商品】等功能,這些功能能夠幫衆用戶查找其它相關的商品,並最終提高網站的銷售業績。緩存
經過將會話cookie和購物車cookie存儲在Redis裏面,咱們獲得了進行數據分析所需的兩個重要的數據來源,接下來將展現若是使用緩存來減小數據庫和Web前端的負載。cookie
上一篇文章: Python--Redis實戰:第二章:使用Redis構建Web應用:第一節:登陸和cookie緩存
下一篇文章: Python--Redis實戰:第二章:使用Redis構建Web應用:第三節:網頁緩存