不才,筆者第一次學習快取,是在學習redis的時候,是在培訓班學習了一些java的啟蒙知識,但是在后來的深入學習之后,對快取又有了新的認識,
1.池的思想,比如java的各種池,常量池,執行緒池,句柄池,連接池,池的思想也是源于快取,就是把一些需要反復建立的物件從一個空間***搬***到一個更快更容易獲取的空間,減少了因為物件的建立而導致的等待時間,也減少了反復新建一個物件的資源和空間,
2.Java的包裝類也有自己的快取資料,所以包裝類的比較也是用equals,而不是“==”,比較的實際內容,而不是實際的堆內地址,
3.JIT(即時編譯器)也會把熱點代碼(超過規定的閾值)放到本地記憶體,而不是反復的使用使用解釋器反復編譯,而是使用編譯器把熱點代碼編譯放到快取,提升后續的編譯效率,這個思想其實也啟發了我在實際作業中對一些程式的優化思考,比如說,在程式中做一些埋點動作來記錄一些資料和物件的出現次數,達到一定閾值后,可以考慮把這些熱點資料存到redis或者本地HashMap,LinkedHashMap中來提高程式整體性能,也減少了堆的空間,減少JVM引數優化的必要,
4.Mybatis也有的自己的一級快取和二級快取,把第一次查詢結構快取到sqlsession和namespace中,實際上我們的Mysql的InnoDB存盤引擎也暖心的增加了自己的快取,所以實際上sqlssion級別的快取只能提升一些ORM轉換,和連接池建立的時間,實際上的sql查詢已經被innoDB快取了,
5.redis把硬碟的資料拿到了記憶體中,提升了服務器拿資料的效率,也減少了反復請求服務器,導致資料從硬碟上由檔案轉化為流的IO壓力較大,
但是濫用快取也會導致很多問題,快取適用與不太經常變化的資料,如果資料變化太快,而導致快取資料沒即時跟新,將會導致一些資料不一致性的問題,快取和索引一樣,如果程式或者服務器本身獲取資料就很快,快取或者索引就失去了存在的必要性,反而會浪費空間和資源,
文筆有限,僅做讀后感而寫,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/253072.html
標籤:其他
