公司快取出了些問題,解決的過程中總結了一些快取使用的方式方法。
公司快取遇到的問題
1) 快取無過期時間導致記憶體占用過高
2) 快取清除後,失效後仍用到,不可從資料庫恢復
造成這些問題的原因是開發人員對快取的設計和使用原則不清楚,架構上也沒有明確的說明和引導。
關於上面的兩個問題
1) 快取新增時一定要有清除策略。程式狀態完結時主動刪除或者設定合理過期時間,不然就會造成記憶體洩漏,當然架構層面可以在記憶體資源緊張時使用一定策略進行**,但是被強制清除的快取如何恢復,能否恢復也是乙個需要考慮的問題,正確的做法應該是清除策略和資源**兩方面同時進行,清除策略為主,資源**只能是預防性的工作,資源**也容易造成問題。另外,正確的監控和統計工作可以發現異常的快取key,防止程式錯誤日積月累占用大量資源突發嚴重問題。
2) 快取過期或者被錯誤清除仍用到不可從資料庫恢復。快取清除仍用到是程式設計上的問題造成的,但不可從資料庫恢復涉及快取資料恢復問題。快取資料應該是資料庫資料的某種對映,因為快取是臨時儲存,本身就是不可靠的,資料庫是持久儲存,是可靠的,快取是為了加速資料訪問,降低資料庫壓力而存在的,所以快取資料應該很容易從資料庫恢復,這裡把快取當做不可恢復的持久儲存用是不對的。如果需要高效能的持久儲存,比如儲存程式中間結果,可以考慮使用redis等(使用時不需要恢復策略,但也需要清除策略)。簡單的說,快取作為非永續性儲存,資料應該是可以很輕易的從持久儲存恢復的。
那快取應該怎樣設計和使用呢?
從設計乙個**的快取角度來考慮能想到的方面,快取應該分類為資料庫快取 (或者說持久儲存,資料都能從db恢復)、臨時資料快取(只需要儲存較短時間的中間資料,能由持久儲存恢復,但時間較長,比如報表資料)、前端快取(頁面快取、頁面片段快取、由html加動態資料混合而成,快取已加快渲染和返回速度),這裡我們只考慮持久儲存快取或者簡單的說資料庫快取。
資料庫快取
定義:資料庫快取是為了加速資料訪問,減輕db壓力而存在的一種臨時性高速儲存。
1) 快取新增
什麼樣的資料應該放到快取裡?訪問頻繁的資料應該放到快取裡,還是說為了提高效能,把大部分資料庫資料放到快取裡?
從效能優化的角度來說,不應該提前優化,應該是遇到效能問題、效能問題初漏端倪、為了預防效能問題而使用快取(最好基於效能測試和監控),所以最開始應該為預估的熱點資料設定快取,或者遇到效能問題時為相關資料新增快取(設定快取應該是開發人員的工作,架構方面應提供快取服務,也可以通過統一的資料訪問層來實現,如果架構方面能根據熱點資料自動應用快取最好,多級快取技術中,靠近底層的的快取應該是根據預估或者統計的資料熱點手動或自動新增的,更高階的快取應該是應用程式或者說呼叫方新增的) 。
3) 快取清除
快取清除策略是必要的,不然就容易發生記憶體洩漏的情況,及時清除快取也可以為新的快取騰出空間,提高快取效能。清除策略應該是程式主動清除和過期時間相結合的方式,在程式層面要做清除,在架構層面要做監控、統計和在資源不足時根據一定策略清除,兩方面都要做。
臨時資料快取
定義:只需要儲存較短時間的中間資料。
臨時資料快取要考慮更新策略和清除策略。更新不是問題,直接更新就行,清除策略可以是主動清除,設定過期時間的話需要明確在過期時間之內不會再次用到該快取,但是設定過期時間往往不太靠譜,因為臨時資料快取不像資料庫快取那樣容易恢復,不設定過期時間因程式bug沒有主動清除快取會累積垃圾資料,不過可以通過定時清理功能來清除,但這需要依賴開發與運維協作,可能效率低下,不過由於程式bug造成累積垃圾資料是不可避免的,定期的開發與運維相配合的架構清理應該也是必要的。
關於web標準的思考
但是,這裡嚴重違反了web標準的基本概念 結構與表現要分離。因為它將用於控制網頁表現的 放在結構文件中了。或許你會說它事實上還是將真正的表現 放在css裡的。但我認為這是乙個偷換概念。因為以上這些b標籤跟網頁結構無關,它們都是一些空標籤。也就是說,它的存在並不是為了將某些內容放在文件結構需要的位置。...
WEB前端 關於專案管理的思考
web前端,指的是 互動 設計 製作三個角色的組合。專案管理,指的是如何把需求分解成任務,分派給合適的人並正確的完成任務。需要把握的是以下四個方面。1 需求分析 需求分析的目的是評審需求的可行性和優先順序,這裡就需要足夠的專案經驗了。可行性 關於需求本身是否合理,是否是乙個值得去做的需求。需求的完整...
也談談關於WEB應用訪問許可權的思考
這樣的需求可能就沒有辦法在 的應用程式裡面實現了,因為在請求1.jpg這個檔案的時候,並沒有涉及到 應用的 任何邏輯,而是在web伺服器承載程式 iis,apache 接到請求報文之後,如果對應的請求檔案在web伺服器承載程式擁有讀許可權的話,那麼則返回這個檔案,否則列印的是web伺服器承載程式的拒...