一個(gè)人重復(fù)快速多次添加一條數(shù)據(jù)或者很多人搶某樣?xùn)|西如果僅僅只是插入前先查詢的話,那么會(huì)出現(xiàn)如下所示的情況:
if(用戶不存在)
{
xxxxx
存儲(chǔ)用戶到數(shù)據(jù)庫(kù)
}
else
{
重復(fù)推送,不采取任何措施
}
這個(gè)操作還沒有執(zhí)行完畢,第二條擁有相同數(shù)據(jù)的線程已經(jīng)進(jìn)入并通過了if的檢驗(yàn),還是導(dǎo)致數(shù)據(jù)庫(kù)存儲(chǔ)了兩條相同的數(shù)據(jù)。
synchronized對(duì)方法添加同步鎖的話也會(huì)影響其他的數(shù)據(jù)啊。而且不想對(duì)數(shù)據(jù)庫(kù)做唯一索引的操作。
哦對(duì)了,我還用到了負(fù)載均衡。
請(qǐng)大家給予一個(gè)好的思路,謝謝~
3 回答

躍然一笑
TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
為什么不用唯一索引
,就是和自己過不去?
好,就和自己過不去,OK:
最簡(jiǎn)單的方法,隊(duì)列
以“很多人搶某樣?xùn)|西”為例,設(shè)一個(gè)記錄“搶”的信息表,不刪、不改、只增加、只讀
無(wú)論多少人多少條請(qǐng)求,都先添加進(jìn)這個(gè)表,不會(huì)有什么唯一性問題,也不會(huì)沖突
定時(shí)任務(wù),讀取這個(gè)“搶”的信息表,想怎么處理?取第一個(gè)?取前100個(gè)?
再更新到實(shí)際的真實(shí)數(shù)據(jù)庫(kù)
說(shuō)到底,就是犧牲時(shí)效,保證正確(很多類似這樣的設(shè)計(jì))
總結(jié):“無(wú)延時(shí)”、“高性能”、“高可用” 不可兼得
,這是常識(shí)。。。

精慕HU
TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊
你先設(shè)置好友多少個(gè)對(duì)象要搶 然后先減1 這個(gè)減要是原子的 然后在慢慢的入庫(kù) 消息隊(duì)列什么的都可以
添加回答
舉報(bào)
0/150
提交
取消