天天看點

《Redis實戰》一2.2 使用Redis實作購物車

本節書摘來異步社群《redis實戰》一書中的第2章,第2.2節,作者: 【美】josiah l. carlson(約西亞 l.卡爾森)譯者: 黃健宏 責編: 楊海玲,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

網景(netscape)公司在20世紀90年代中期最先在網絡中使用了cookie,這些cookie最終變成了我們在上一節讨論的登入會話cookie。cookie最初的意圖在于為網絡零售商(web retailer)提供一種購物車,讓使用者可以收集他們想要購買的商品。在cookie之前,有過幾種不同的購物車解決方案,但這些方案全都不太好用。

使用cookie實作購物車——也就是将整個購物車都存儲到cookie裡面的做法非常常見,這種做法的一大優點是無須對資料庫進行寫入就可以實作購物車功能,而缺點則是程式需要重新解析和驗證(validate)cookie,確定cookie的格式正确,并且包含的商品都是真正可購買的商品。cookie購物車還有一個缺點:因為浏覽器每次發送請求都會連cookie一起發送,是以如果購物車cookie的體積比較大,那麼請求發送和處理的速度可能會有所降低。

因為我們在前面已經使用redis實作了會話cookie和記錄使用者最近浏覽過的商品這兩個特性,是以我們決定将購物車的資訊也存儲到redis裡面,并且使用與使用者會話cookie相同的cookie id來引用購物車。

購物車的定義非常簡單:每個使用者的購物車都是一個散列,這個散列存儲了商品id與商品訂購數量之間的映射。對商品數量進行驗證的工作由web應用程式負責,我們要做的則是在商品的訂購數量出現變化時,對購物車進行更新:如果使用者訂購某件商品的數量大于0,那麼程式會将這件商品的id以及使用者訂購該商品的數量添加到散列裡面,如果使用者購買的商品已經存在于散列裡面,那麼新的訂購數量會覆寫已有的訂購數量;相反地,如果使用者訂購某件商品的數量不大于0,那麼程式将從散列裡面移除該條目。代碼清單2-4的add_to_cart()函數展示了程式是如何更新購物車的。

代碼清單2-4 add_to_cart()函數

《Redis實戰》一2.2 使用Redis實作購物車

接着,我們需要對之前的會話清理函數進行更新,讓它在清理舊會話的同時,将舊會話對應使用者的購物車也一并删除,更新後的函數如代碼清單2-5所示。

代碼清單2-5 clean_full_sessions()函數

《Redis實戰》一2.2 使用Redis實作購物車

我們現在将會話和購物車都存儲到了redis裡面,這種做法除了可以減少請求的體積之外,還使得我們可以根據使用者浏覽過的商品、使用者放入購物車的商品以及使用者最終購買的商品進行統計計算,并建構起很多大型網絡零售商都在提供的“在檢視過這件商品的使用者當中,有x%的使用者最終購買了這件商品”“購買了這件商品的使用者也購買了某某其他商品”等功能,這些功能可以幫助使用者查找其他相關的商品,并最終提升網站的銷售業績。

通過将會話cookie和購物車cookie存儲在redis裡面,我們得到了進行資料分析所需的兩個重要的資料來源,接下來的一節将展示如何使用緩存來減少資料庫和web前端的負載。