專案修煉之路(5)高併發下優化Redis快取效率

2021-07-10 00:03:14 字數 2756 閱讀 6004

最近,公司給了個優化任務,某個耗時的操作,在百億的交易額下,處理異常緩慢,需要優化,以為每日發息做準備,在這裡給大家介紹下我的優化思路,共同**下:

**邏輯:

通過使用者id獲取使用者所在區域id,每次批量處理1千個使用者,起20個執行緒處理。

通過使用者id獲取使用者所在區域id分兩步實現(**中已經標紅),第一步通過使用者獲取城市id,第二部通過城市id獲取區域id,使用上篇部落格介紹的方法(專案修煉之路(4)aop+註解的自動快取),給兩個方法加入redis快取。

@override

public publicresult> getuserareafranchiseeids(listuids)

}logger.info("=getuserareafranchiseeids=>--..uid:["+uid+"].[get -- wmpsdayinterchange]getlogictongchengareaservice() -------------spen time:" + (system.currenttimemillis()-time));

}catch (exception e)

resultmap.put(uid,areaid);

} result.setsuccess(true);

result.setresult(resultmap);

return result;

}

問題:加入快取後,發現,當訪問頻繁時,兩次訪問加入的快取不合理:1,value為物件,給每次取值增加反序列化過程,實際只需id即可;2,兩次操作,最終只需乙個結果,造成資源浪費。

優化後:二次快取變為一次快取,key與value均為簡單string與integer

@override

public publicresultgetuserareafranchiseeids(arraylistuids) catch (exception e)

resultmap.put(uid,areaid);

} result.setsuccess(true);

result.setresult(json.tojsonstring(resultmap));

return result;

}

問題:redis為單執行緒,批量資料訪問時,單個從redis拿資料的時間被延長,造成時間上的浪費,而且,浪費在網路上的時間比讀資料時間要長

優化後:批量從redis獲取一次獲取,多次io改為一次io,拿不到的資料,才從資料庫中讀取,同時快取到redis。

@override

public publicresultgetuserareafranchiseeids(arraylistuids) catch (exception e)

listareas.set(i,areaid);

}areaid = listareas.get(i);

resultmap.put(uid,areaid);

} result.setsuccess(true);

result.setresult(json.tojsonstring(resultmap));

return result;

}

問題:設定快取週期後,每隔一段時間,讀取資料幾乎全從資料庫讀取,加上增加到redis的時間,會造成週期性讀取緩慢。

優化後:時間限制拉長,判斷是否能從redis獲取一半的資料,如果不能,批量將資料快取到redis(一次io),再走邏輯

@override

public publicresultgetuserareafranchiseeids(arraylistuids)

}catch (exception e)

for(int i=0 ;i--.uid:[" + uid + "].[get -- wmpsdayinterchange]getuserareaidbyuid() -------------spen time:" + (system.currenttimemillis() - time));

}catch (exception e)

listareas.set(i,areaid);

}areaid = listareas.get(i);

resultmap.put(uid,areaid);

} result.setsuccess(true);

result.setresult(json.tojsonstring(resultmap));

return result;

} private boolean initredisbyuids(arraylistuids)

}}catch(exception e)

return issuccess;

} private hashmapuidtorediskeyandvlues(listlistuserarea)

hashmapresult = new hashmap();

integer maxnum=null;

integer minnum=null;

for(int i=0;ilisttest.get(i))}}

if(maxnum==null || minnum == null)

result.put(maxnumkey,maxnum);

result.put(minnumkey,minnum);

return result;

}}

Linux 高併發下效能優化

ulimit用於shell啟動程序所占用的資源,暫時地,適用於通過 ulimit 命令登入 shell 會話期間 vi etc profile 儲存後執行 source etc profile 使其生效 ulimit 顯示 或設定 使用者可以使用的資源的限制 limit 這限制分為軟限制 當前限制 ...

高併發下的nginx優化

網際網路分布式架構設計,提高系統併發能力的方式主要有兩種 垂直擴充套件 scale up 與水平擴充套件 scale out 垂直擴充套件 提公升單機處理能力。垂直擴充套件的方式又有兩種。增強單機硬體效能 提公升單機架構效能 水平擴充套件 增加伺服器,集群。在網際網路業務發展非常迅猛的早期,如果預算...

高併發下投標過程進行優化

業務流程 對於乙個融資標的invest表,標的id,標的總融資金額 total money 已投資金額 invested money 滿標時間 finish invest time 標的狀態 status 假如有多個使用者user同時投標,投資金額為m,為保證資料一致性,以下步聚在同乙個事務當中 1...