在做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:staticArrayListpvList=newArrayList();publicsynchronizedvoidcountPv(...){//........生成一個(gè)PV對(duì)象pvList.add(PV)if(pvList.size()>10){//前10個(gè)加到redisaddRedis(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刪除、查找的開(kāi)銷都非常大,而且貌似沒(méi)法用于這種場(chǎng)合p.s.您能留段偽碼就最好了
如何手動(dòng)擼一個(gè)能夠滿足下列并發(fā)的隊(duì)列?
四季花海
2019-05-24 15:59:42