中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用redis怎么實現一個購物車基本功能

發布時間:2021-06-21 18:15:09 來源:億速云 閱讀:544 作者:Leah 欄目:大數據

這篇文章給大家介紹使用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怎么實現一個購物車基本功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

余庆县| 福鼎市| 和顺县| 甘洛县| 沽源县| 镇雄县| 沈丘县| 东城区| 桃江县| 万山特区| 综艺| 丽水市| 鄂州市| 荔波县| 三门县| 宣恩县| 茶陵县| 滨州市| 济源市| 商城县| 新余市| 齐河县| 饶阳县| 斗六市| 靖边县| 登封市| 吴桥县| 渝北区| 彰武县| 梓潼县| 安远县| 北川| 烟台市| 葫芦岛市| 伊川县| 宜君县| 北宁市| 增城市| 普格县| 寻甸| 晋中市|