自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

庫(kù)存扣減還有這么多方案?

開發(fā) 開發(fā)工具
本篇文章主要是對(duì)上篇文章《庫(kù)存扣多了,到底怎么整》里方案的交流回復(fù)。

昨天一篇《庫(kù)存扣多了,到底怎么整》,核心觀點(diǎn)是:

  • 用“設(shè)置庫(kù)存”替代“扣減庫(kù)存”,以保證冪等性
  • 使用CAS樂觀鎖,在“設(shè)置庫(kù)存”時(shí)加上原始庫(kù)存的比對(duì),避免數(shù)據(jù)不一致

原以為兩個(gè)核心觀點(diǎn)應(yīng)該是沒有疑義的,結(jié)果很多朋友說方案不好,今天交流下部分回復(fù)的方案,個(gè)人的一些看法。

[[194455]]

留言一

是否能使用

  1. update stock set numnum=num-$count where sid=$sid and stock>=$count; 

的方式扣減庫(kù)存?

回答:這個(gè)方案無(wú)法保證冪等性,有可能出現(xiàn)重復(fù)扣減。

留言二

把庫(kù)存放到reids里,利用redis的事務(wù)性來(lái)扣減庫(kù)存。

分析:

redis是如何實(shí)現(xiàn)事務(wù)操作的?

本質(zhì)也是樂觀鎖。

在redis客戶端執(zhí)行:

  1. $num = GET key 
  2. $num = $num - $count 
  3. SET key $num 

在并發(fā)量大的時(shí)候,會(huì)遇到和《庫(kù)存扣多了,到底怎么整》文章中一樣的并發(fā)一致性問題。

redis的WATCH和EXEC可以提供類似事務(wù)的機(jī)制:

  • WATCH觀察key是否被改動(dòng)
  • 如果提交時(shí)key被改動(dòng),EXEC將返回null,表示事務(wù)失敗

上面保證一致性的庫(kù)存扣減可能類似于這樣執(zhí)行:

  1. WATCH key 
  2. $num = GET key 
  3. $num = $num - $count 
  4. MULTI 
  5. SET key $num 
  6. EXEC 

在WATCH之后,EXEC執(zhí)行之前,如果key的值發(fā)生變化,則EXEC會(huì)失敗。

redis的WATCH為何能夠保證事務(wù)性,本質(zhì)上,它使用的就是樂觀鎖CAS機(jī)制。

大部分情況下,redis不同的客戶端會(huì)訪問不同的key,所以WATCH碰撞的概率會(huì)比較小,在秒殺的業(yè)務(wù)場(chǎng)景,即使使用WATCH,調(diào)用側(cè)仍然需要重試。

在CAS機(jī)制這一點(diǎn)上,redis和mysql相比沒有額外的優(yōu)勢(shì)。

redis的性能之所以高,還是redis內(nèi)存訪問與mysql數(shù)據(jù)落盤的差異導(dǎo)致的。內(nèi)存訪問的不足是,數(shù)據(jù)具備“易失性”,如果重啟,可能導(dǎo)致數(shù)據(jù)的丟失。當(dāng)然redis也可以固化數(shù)據(jù),難道每次都刷盤?redis真心沒法當(dāng)作mysql用。

***,redis用單線程來(lái)避免物理鎖,但mysql多線程也有多線程并發(fā)的優(yōu)勢(shì)。

回答:可以使用redis的事務(wù)性扣減庫(kù)存,但在CAS機(jī)制上比mysql沒有優(yōu)勢(shì),高性能是因?yàn)槠鋬?nèi)存存儲(chǔ)的原因,帶來(lái)的副作用是數(shù)據(jù)有丟失風(fēng)險(xiǎn),具體怎么用,還得結(jié)合業(yè)務(wù)折衷(任何脫離業(yè)務(wù)的架構(gòu)設(shè)計(jì)都是耍流氓)。

留言三

支持冪等能否使用客戶端token,業(yè)務(wù)流水?

能否使用時(shí)間戳,版本號(hào)來(lái)保證一致性?

回答:可以。

留言四

能否使用隊(duì)列,在數(shù)據(jù)庫(kù)側(cè)串行執(zhí)行,降低鎖沖突?

回答:可以。

留言五

能否使用事務(wù)?

回答:容易死鎖,吞吐量很低,不建議。

留言六

能否使用分布式鎖解決,例如setnx, mc, zookeeper?

回答:可以,但吞吐量真的高么。

留言七

文章重點(diǎn)講了冪等性和一致性,沒有深入展開講高吞吐,利用緩存抗讀請(qǐng)求,利用水平擴(kuò)展增加性能是提升吞吐量的根本方案。

回復(fù):很中肯。

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2024-08-28 08:56:24

2021-01-14 05:08:44

編譯鏈接

2024-02-20 08:09:51

Java 8DateUtilsDate工具類

2023-11-13 08:49:54

2024-05-13 16:22:25

固態(tài)硬盤接口硬盤

2017-07-04 14:01:40

機(jī)房機(jī)柜

2017-03-27 11:29:33

微軟Windows XP安全

2018-05-29 14:57:59

HashMap容量初始化

2022-01-12 20:04:09

網(wǎng)絡(luò)故障斷網(wǎng)事件網(wǎng)絡(luò)安全

2018-01-31 16:12:47

筆記本輕薄本游戲本

2021-01-11 13:46:26

Spring BootThymeleafJava

2022-05-29 08:54:44

Edge瀏覽器

2024-01-02 12:48:49

2024-01-31 12:34:16

panic錯(cuò)誤檢測(cè)recover

2022-03-03 07:00:43

Mybatiswhere標(biāo)簽

2021-06-09 18:52:05

方案設(shè)計(jì)庫(kù)存數(shù)

2018-06-26 15:00:24

Docker安全風(fēng)險(xiǎn)

2020-01-02 10:06:16

Java 8Java 14

2020-06-16 14:11:48

find命令文件查找

2021-05-31 22:26:20

5G技術(shù)通信
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)