溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

使用redis怎么實(shí)現(xiàn)一個(gè)購(gòu)物車(chē)基本功能

發(fā)布時(shí)間:2021-06-21 18:15:09 來(lái)源:億速云 閱讀:534 作者:Leah 欄目:大數(shù)據(jù)

這篇文章給大家介紹使用redis怎么實(shí)現(xiàn)一個(gè)購(gòu)物車(chē)基本功能,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

1.準(zhǔn)備工作:

數(shù)據(jù)庫(kù)表設(shè)計(jì) (yj_product_specification:商品規(guī)格表,用戶(hù)表,商品表等     {沒(méi)有規(guī)格表,只有規(guī)格值表,}),

測(cè)試工具:POSTMAN

redis客戶(hù)端:Redis Desktop Manager

其他的工具 我就不一 一說(shuō)了 。

邏輯處理 :

購(gòu)物車(chē)基本功能:

1.購(gòu)物車(chē)列表

2.加入購(gòu)物車(chē)

3.刪除購(gòu)物車(chē)某個(gè)商品

4.清空購(gòu)物車(chē)

首先來(lái)分析一下加入購(gòu)物車(chē),這也是購(gòu)物車(chē)中最難的功能(個(gè)人認(rèn)為)

加入購(gòu)物車(chē)時(shí)  我們要考慮到  對(duì)于一個(gè)客戶(hù)來(lái)說(shuō)  不同規(guī)格,不同商品 ,在內(nèi)存中應(yīng)該怎么處理 ,  必要的幾個(gè)參數(shù)   首先用戶(hù)信息要得到(mem_Id),商品的信息(prd_id),商品所對(duì)應(yīng)規(guī)格值的id,這個(gè)信息我們都要取到,我們還要考慮對(duì)于不同用戶(hù),不同的信息,在redis要怎么存儲(chǔ)。redis的類(lèi)型我就不在這里說(shuō)了。我在redis做的劃分是  以用戶(hù)的id作為redis的key  當(dāng)然對(duì)于不同商品來(lái)說(shuō)  我們還要注意一個(gè)商品的不同規(guī)格,數(shù)量都是要區(qū)分的(我們是用hash來(lái)存儲(chǔ)的),而且還是保證hash的key唯一。如果說(shuō)我們把hash的key由商品id,規(guī)格值 等共同組成的話(huà)   那么這樣的話(huà)  我們這樣就可以很容易就區(qū)分的清楚。對(duì)于前端傳過(guò)來(lái)的參數(shù)都是固定,所以我們直接用一個(gè)實(shí)體來(lái)接收

用debug看一下  這個(gè)cart里面是什么東西   注意看一下這個(gè)那個(gè)多信息拼裝的     

private void addCart(Member member, Cart cart) throws Exception {
// 監(jiān)聽(tīng)當(dāng)前登陸用戶(hù)
Jedis jedis = jedisUtil.KEYS.watch("cart_" + member.getId());// 監(jiān)聽(tīng)key
Transaction multi = jedis.multi(); // 用返回的jedis對(duì)象開(kāi)啟事務(wù)
        String cartFiled = cart.getProductId() + "_" + cart.getSpecificationValueIds();
        // 購(gòu)物車(chē)對(duì)象字符串,查詢(xún)到當(dāng)前redis上這個(gè)規(guī)格的購(gòu)物車(chē)信息
String cartStr = jedisUtil.HASH.hget("cart_" + member.getId(),cartFiled);
//將String類(lèi)型轉(zhuǎn)為Cart對(duì)象
Cart _cart = Cart.parseObject(cartStr);
// 購(gòu)物車(chē)存在,商品數(shù)量做累加
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;
}


// 一個(gè)用戶(hù)一個(gè)購(gòu)物車(chē),一個(gè)商品規(guī)格對(duì)應(yīng)一個(gè)購(gòu)物車(chē)項(xiàng),將購(gòu)物車(chē)存到redis
multi.hset("cart_" + member.getId(), cartFiled, _cart.toJSONString());


// 獲取事務(wù)執(zhí)行結(jié)果,如果監(jiān)聽(tīng)的mahjongXA的值發(fā)生改變事務(wù)會(huì)執(zhí)行失敗,返回null
List<Object> exec = multi.exec();
// 釋放監(jiān)聽(tīng)
jedisUtil.KEYS.unwatch(jedis);
// 當(dāng)事務(wù)執(zhí)行失敗是重新執(zhí)行一次代碼
if (exec == null) {
addCart(member, cart);
}

}

在用戶(hù)加入購(gòu)物車(chē)的時(shí)候,我們需要先看一下   當(dāng)前商品和規(guī)格   在redis里面是否已經(jīng)存在  如果存在  就直接在數(shù)量上面加減  不存在的就直接加入就可以了 

// 購(gòu)物車(chē)存在,商品數(shù)量做累加
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;

}

對(duì)于在用戶(hù)在客戶(hù)端操作方面來(lái)說(shuō)  如果用戶(hù)在前端連續(xù)點(diǎn)擊   有可能造成并發(fā),所以在加入購(gòu)物車(chē)的時(shí)候我注意并發(fā)事件,redis為我提供了watch   我可以通過(guò)watch來(lái)監(jiān)聽(tīng)  ,避免連續(xù)點(diǎn)擊

當(dāng)取redis緩存的時(shí)候,值發(fā)生改變的,watch下面的事物事件會(huì)中斷,這樣的話(huà) 

exec對(duì)象就為null   就會(huì)去redis里面再去取一次。

對(duì)于購(gòu)物車(chē)的刪除和清空  就比較簡(jiǎn)單了  我們只要了解redis的存儲(chǔ) 就可以輕松解決這兩個(gè)功能。

當(dāng)然 對(duì)于用戶(hù)來(lái)說(shuō)   分為登陸用戶(hù)和未登陸用戶(hù)。以上為登錄用戶(hù),未登錄用戶(hù)的  需要先存cookie里面   當(dāng)?shù)顷懙臅r(shí)候從cookie里面取出來(lái)。 
 

關(guān)于使用redis怎么實(shí)現(xiàn)一個(gè)購(gòu)物車(chē)基本功能就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI