第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何手動(dòng)擼一個(gè)能夠滿足下列并發(fā)的隊(duì)列?

如何手動(dòng)擼一個(gè)能夠滿足下列并發(fā)的隊(duì)列?

qq_笑_17 2019-02-18 06:15:20
在做puv統(tǒng)計(jì)時(shí)碰到的一個(gè)問(wèn)題,用戶請(qǐng)求過(guò)來(lái)會(huì)記錄為一個(gè)pv,記錄到redis中,但由于pv量太大會(huì)給redis造成過(guò)大壓力,所以做個(gè)緩存,當(dāng)pv滿10條了發(fā)一次。用了一個(gè)隊(duì)列ArrayList實(shí)現(xiàn),但隊(duì)列的插入、刪除在并發(fā)條件下不可行,所以在方法上加了synchronized: static ArrayList<Object> pvList = new ArrayList<Object>(); public synchronized void countPv(...){ //........生成一個(gè)PV對(duì)象 pvList.add(PV) if(pvList.size()>10){ //前10個(gè)加到redis addRedis(pvList.subList(0,10)) } //刪除10個(gè) pvList.subList(0,10).clear(); } 但在壓力測(cè)試中,如果已滿負(fù)荷的連續(xù)壓測(cè),發(fā)現(xiàn)會(huì)丟掉一些pv,可能是synchronized造成的堵塞導(dǎo)致,如何更好的實(shí)現(xiàn)這個(gè)需求呢? 每10個(gè)請(qǐng)求發(fā)一次,而后刪除,同時(shí)可以滿足不斷累加 synchronized放到函數(shù)里面估計(jì)提升并不大,畢竟add,size,clear方法都必須滿足同步需求 ConcurrnetLinkedQueue, Concurrent...Array刪除、查找的開銷都非常大,而且貌似沒(méi)法用于這種場(chǎng)合 p.s. 您能留段偽碼就最好了
查看完整描述

7 回答

?
牛魔王的故事

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個(gè)贊

public synchronized void countPv(...){
    //........生成一個(gè)PV對(duì)象
   
    pvList.add(PV)
    if(pvList.size() > 10){
        addRedis(pvList.subList(0,10))
    }

    pvList.subList(0,10).clear();
}

pvList.subList(0,10).clear(); 這句代碼不應(yīng)該寫到 if 里面嗎?
既然 pvList 是 static 的(類變量),那么 countPV 也應(yīng)該是 static 的才對(duì),這樣 synchronize 使用的鎖才會(huì)是 class,而不是對(duì)象。

查看完整回答
反對(duì) 回復(fù) 2019-03-01
?
慕俠2389804

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊

不知道你說(shuō)的滿負(fù)荷壓測(cè)時(shí)丟pv指的是什么,有沒(méi)有記錄這種情況下,服務(wù)器返回的狀態(tài)碼是什么?是因?yàn)槌瑫r(shí)么?
如果是因?yàn)閴毫^(guò)大超出服務(wù)器載能力,換用或其他數(shù)據(jù)結(jié)構(gòu)也不見(jiàn)得好到哪去, 如果想解鎖synchronized, 可能試試多例模式. 每個(gè)服務(wù)線程創(chuàng)建自己私有的緩存.

查看完整回答
反對(duì) 回復(fù) 2019-03-01
?
慕標(biāo)5832272

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊

@fengdui 有一句評(píng)論說(shuō)得好,Redis操作要搬出去。

方法一:

// 把10個(gè)元素return出去讓外面的調(diào)用者去調(diào)Redis,別占用同步塊的時(shí)間
public synchronized List<Object> countPv(...) {
  ...
}

方法二:開個(gè)線程池去異步發(fā)Redis,但是機(jī)器重啟會(huì)丟失來(lái)不及發(fā)送的數(shù)據(jù)

if (pvList.size() > 10) {
        //前10個(gè)打包成任務(wù)扔給線程池
        senderExecutor.execute(new SendTask(new ArrayList<>(pvList.subList(0,10)))); //當(dāng)場(chǎng)復(fù)制了subList
        pvList.subList(0,10).clear(); //這行要移到這里,這可能就是你丟數(shù)據(jù)的原因
}
查看完整回答
反對(duì) 回復(fù) 2019-03-01
?
慕運(yùn)維8079593

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊

pipeline ?

查看完整回答
反對(duì) 回復(fù) 2019-03-01
  • 7 回答
  • 0 關(guān)注
  • 487 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)