您好,登錄后才能下訂單哦!
這篇文章給大家介紹使用redis怎么實現一個購物車基本功能,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
1.準備工作:
數據庫表設計 (yj_product_specification:商品規格表,用戶表,商品表等 {沒有規格表,只有規格值表,}),
測試工具:POSTMAN
redis客戶端:Redis Desktop Manager
其他的工具 我就不一 一說了 。
邏輯處理 :
購物車基本功能:
1.購物車列表
2.加入購物車
3.刪除購物車某個商品
4.清空購物車
首先來分析一下加入購物車,這也是購物車中最難的功能(個人認為)
加入購物車時 我們要考慮到 對于一個客戶來說 不同規格,不同商品 ,在內存中應該怎么處理 , 必要的幾個參數 首先用戶信息要得到(mem_Id),商品的信息(prd_id),商品所對應規格值的id,這個信息我們都要取到,我們還要考慮對于不同用戶,不同的信息,在redis要怎么存儲。redis的類型我就不在這里說了。我在redis做的劃分是 以用戶的id作為redis的key 當然對于不同商品來說 我們還要注意一個商品的不同規格,數量都是要區分的(我們是用hash來存儲的),而且還是保證hash的key唯一。如果說我們把hash的key由商品id,規格值 等共同組成的話 那么這樣的話 我們這樣就可以很容易就區分的清楚。對于前端傳過來的參數都是固定,所以我們直接用一個實體來接收
用debug看一下 這個cart里面是什么東西 注意看一下這個那個多信息拼裝的
private void addCart(Member member, Cart cart) throws Exception {
// 監聽當前登陸用戶
Jedis jedis = jedisUtil.KEYS.watch("cart_" + member.getId());// 監聽key
Transaction multi = jedis.multi(); // 用返回的jedis對象開啟事務
String cartFiled = cart.getProductId() + "_" + cart.getSpecificationValueIds();
// 購物車對象字符串,查詢到當前redis上這個規格的購物車信息
String cartStr = jedisUtil.HASH.hget("cart_" + member.getId(),cartFiled);
//將String類型轉為Cart對象
Cart _cart = Cart.parseObject(cartStr);
// 購物車存在,商品數量做累加
if (_cart != null) {
Integer num = cart.getNumber();
_cart.setNumber(_cart.getNumber() + num);
_cart.setPrice(cart.getPrice());
_cart.setFullName(cart.getFullName());
_cart.setImage(cart.getImage());
} else{
_cart = cart;
}
// 一個用戶一個購物車,一個商品規格對應一個購物車項,將購物車存到redis
multi.hset("cart_" + member.getId(), cartFiled, _cart.toJSONString());
// 獲取事務執行結果,如果監聽的mahjongXA的值發生改變事務會執行失敗,返回null
List<Object> exec = multi.exec();
// 釋放監聽
jedisUtil.KEYS.unwatch(jedis);
// 當事務執行失敗是重新執行一次代碼
if (exec == null) {
addCart(member, cart);
}
}
在用戶加入購物車的時候,我們需要先看一下 當前商品和規格 在redis里面是否已經存在 如果存在 就直接在數量上面加減 不存在的就直接加入就可以了
// 購物車存在,商品數量做累加
if (_cart != null) {
Integer num = cart.getNumber();
_cart.setNumber(_cart.getNumber() + num);
_cart.setPrice(cart.getPrice());
_cart.setFullName(cart.getFullName());
_cart.setImage(cart.getImage());
} else{
_cart = cart;
}
對于在用戶在客戶端操作方面來說 如果用戶在前端連續點擊 有可能造成并發,所以在加入購物車的時候我注意并發事件,redis為我提供了watch 我可以通過watch來監聽 ,避免連續點擊
當取redis緩存的時候,值發生改變的,watch下面的事物事件會中斷,這樣的話
exec對象就為null 就會去redis里面再去取一次。
對于購物車的刪除和清空 就比較簡單了 我們只要了解redis的存儲 就可以輕松解決這兩個功能。
當然 對于用戶來說 分為登陸用戶和未登陸用戶。以上為登錄用戶,未登錄用戶的 需要先存cookie里面 當登陸的時候從cookie里面取出來。
關于使用redis怎么實現一個購物車基本功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。