當前位置:成語大全網 - 新華字典 - 轉載如何安全更新java本地緩存

轉載如何安全更新java本地緩存

但是,隨著緩存的使用,更新緩存是不可避免的。最近我在做壹個項目的時候,發現很多老系統采用了不安全的更新方案。這個方案的主要思想是:Java代碼/* *本地緩存*/私有列表configs = null/* *本地緩存的上次更新時間*/private long Last update time = 0;public List queryInterfaceList(){ long current time = system . current time millis();//判斷這個緩存是否過期。如果過期,再次調用webservice查詢數據並更新緩存If(當前時間-上次更新時間>;60000){ interfacemanagesult result = interfacemanagefade . queryallinterfacelist();if (null!=結果& amp& ampresult . ISS access()){ configs = result . getinterfaceconfiglist();} lastUpdateTime = currentTime}如果(!collection utils . isempty(configs)){返回配置;}//如果本地緩存為空,則再次調用webservice查詢數據,並用InterfaceManagerResult = interfacemanagefade更新緩存。QueryallinterfaceList();if (null == result ||!result . is success()){ return null;} configs = result . getinterfaceconfiglist();返回配置;}當外部請求訪問緩存的數據時:如果緩存已經過期(當前時間-緩存的最後更新時間超過緩存的有效期),則再次調用webservice訪問服務器查詢數據,然後更新緩存。如果緩存沒有過期,但是緩存為空,則再次調用webservice訪問服務器查詢數據,然後更新緩存。仔細分析,該方案存在幾個安全隱患:如果緩存在某個時刻過期,會有大量的請求並發訪問緩存的數據,會對服務器造成很大的壓力。有多少並發請求將被發送到服務器,以及有多少webservice請求將被發送到服務器。在緩存第壹次初始化之前,如果有大量的請求並發訪問緩存的數據,也會在早上給服務器很大的壓力。也就是在某個時間點會給服務器帶來峰值抖動。實際上,這種隱患的根本原因是緩存更新的定時是由外部請求直接觸發的。