1. 程式人生 > >一級快取,二級快取,分散式快取和頁面快取

一級快取,二級快取,分散式快取和頁面快取

1、快取介紹

當處理器讀取資料時,首先會從快取中查詢,如果快取有資料,那麼處理器直接使用,如果快取中中沒有,則從讀取速度相對慢的記憶體中讀取,同時把這個資料塊調入快取中,以便再次使用,這樣可以大大節省讀取記憶體的時間。

Java-EE中快取對於資料量大,高併發顯得特別重要

  1. 使用者–後臺 採用OSCache快取
  2. 持久層一級快取
  3. 持久層二級快取
  4. 分散式快取 
    這裡寫圖片描述

1、一級快取

hibernate根據ID訪問資料物件的時候,首先會從Session一級快取中查詢,如果查不到並且配置了二級快取,那麼會從二級快取中查詢,如果還查不到,就會查詢資料庫,把結果按照ID放入到快取中。

一級快取作用於Dao層(資料庫)

這裡寫圖片描述

1、在Hiberante中也就是Session級別快取,與Session繫結,生命週期與Session也相同。

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Session session<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span>factory<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>openSession();
    Transaction ts <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">null</span>;
    try {
      ts<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span>session<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>beginTransaction(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//開始一個事務</span>
      <span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>                       <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//執行事務</span>
      ts<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>commit();                           <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//提交事務</span>
    } catch (HibernateException e) {     <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果出現異常就撤銷事務</span>
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(ts<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">!=</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">null</span>){
        ts<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>rollback();                        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//回滾事務</span>
      }
      e<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>printStackTrace();
    } finally{
      session<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>close();<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//不管事務執行成功與否,最後都關閉Session並且放在finally中以提高安全性</span>
    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

優點:快取在記憶體中,讀取速度較快 
快取具體到某個事務,範圍比較小

缺點:記憶體容量有限,通過合理的方式檢索或者限制查詢大小。

2、二級快取

這裡寫圖片描述

二級快取是在SessionFactory中(也就是在資料庫連線池中所有dao共享)

快取介質:記憶體和硬碟,如果記憶體快取達到上限時,可指定硬碟快取,在Hibernate中就是CacheProvider(快取介面卡)

二級快取適用場景:

  1. 很少被修改的資料
  2. 對併發要求不高
  3. 不重要的資料
<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">run</span>() {

           SessionFactory sf = CacheMain.getSessionFactory();

           Session session = sf.getCurrentSession();


           session.beginTransaction();



           User user = (User)session.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">get</span>( User.class, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1"</span> );

           System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println( user );        

           session.getTransaction().commit();

}
       <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) {

              CacheMain main1 = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> CacheMain();
              main1.start();
              CacheMain main2 = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> CacheMain();
              main2.start();
       }

}

</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li></ul>

3、分散式快取

分頁式快取CARP(Caching Array Routing Protocol)技術,可以產生一種高效無接縫式的快取,使得讓多臺快取伺服器形同一臺,並且不會造成資料重複存放的情況。 
同時還有層次快取,動態快取和計劃快取三種。

這裡寫圖片描述

5、OSCache

OSCache是一種頁面快取技術 
快取任何物件,你可以不受限制的快取部分jsp頁面或HTTP請求,任何java物件都可以快取。

快取介質:記憶體和硬碟。

OSCache快取域分application和session兩種 
application(對效能優化作用很明顯)和某個 使用者某次操作某個網站session(使用者和web伺服器會話)級共享兩種。對共享的資源設定過期時間。即當伺服器執行時發現在 
作用域內還有物件,就以類似靜態頁面的形式(因為快取了要顯示的資訊)提供給客戶端,當過期了,就需要重查資源(如果是頁面裡的快取就需要資源能在jsp 裡提供)。如果沒有過期,但內容改變了,可以通過flush的方式清除老資源以便載入新的資源。

相關推薦

一級快取二級快取分散式快取頁面快取

1、快取介紹 當處理器讀取資料時,首先會從快取中查詢,如果快取有資料,那麼處理器直接使用,如果快取中中沒有,則從讀取速度相對慢的記憶體中讀取,同時把這個資料塊調入快取中,以便再次使用,這樣可以大大節省讀取記憶體的時間。 在Java-EE中快取對於資料量大,高併發顯得特

三級快取二級取樣螢幕適配

1,三級快取 why?站在使用者的角度為使用者考慮提高使用者的體驗度,當記憶體中有圖片之後就不再網路中進行下載,節省了圖片展示的時間和流量的耗費。要了解這個原理手心需要知道連個概念是強引用和若引用的概念基本的概念:強引用:若引用:儲存的步驟: 記憶體---sd卡--網路下載再

一級域名(頂級域名)二級域名主域名次域名聯絡與區別及域名帶不帶www的區別

相關參考文件 域名概念: (英語:Domain Name),簡稱域名、網域,是由一串用點分隔的名字組成的Internet上某一臺計算機或計算機組的名稱,用於在資料傳輸時標識計算機的電子方位(有時也指地理位置)。 頂級域名(也叫一級域名,即倒數第一個點的右邊): ***通用頂級域*

一級指標二級指標指標陣列指標陣列的理解及相關應用

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> 一級指標 int main() { //字元型指標的一般使用 /*char p = ‘w’; char pc = &p; pc = ‘w’

一級域名二級域名父域名子域名之間的聯絡

每次看到http協議啊,域名什麼的之類的都會去搜索文章。但是看完又記得不牢靠,白費時間,索性這一次好好地理解明白。將自己的理解記錄下來。 一級域名(父域名):又頂級域名。分為類別頂級域名和地理頂級

指標二級指標指標陣列與陣列指標 練習day—17

1.指標 1)指標就是個變數,用來存放地址,地址唯一標識一塊記憶體空間; 2)指標的大小是固定的4(8)個位元組(32(64)位平臺); 3)指標是有型別的,指標的型別決定了指標的+/-整數的步長,指標解引用操作時的許可權; int main() { in

搭建CA二級CA簽發證書

1 搭建CA 1.1 環境的搭建 首先建立CA目錄,所有與CA相關的內容都包含在這個資料夾中。然後在這個目錄下再建立2個資料夾newcerts和private,分別用於存放CA釋出的證書和CA的私鑰。另外還需要建立3個檔案,第一個檔案用來追蹤已經發布的證書的序列號,因為每個

C語言二級指標矩陣操作

這麼基礎的操作,都忘光了.... 二級指標引數傳遞之後,一級解引用不知道要解成什麼型別,就會報錯,所以需要(int*)強轉一次轉回來。 呼叫方法不是網上說的(*(MatrixA+i))[j],也不是*(*(MatrixA+i)+j) !!! 可以除錯檢視記憶體,二級指標的

hibernate一級快取二級快取三級快取快取演算法及配置

什麼是快取(我的理解):在記憶體中開闢一塊空間,把原來在硬碟上的東西,放到記憶體當中,當需要用到一些資料時,直接在記憶體中查詢,而不是到硬碟上查詢。這塊記憶體中的空間就是快取。快取能提高程式的執行效率。 一級快取(session級的快取):在一個session中load同一個物件2次,

Mybatishibernate的一級二級快取問題

Mybatis .一級快取(sqlSession)     一級快取是SqlSession自帶的。SqlSession物件被建立,一級快取就存在了。     如果SqlSession物件關閉或呼叫清理方法,會導致快取失效。     快取底層實現就是通過HashMap實現的。

ibatis 一級快取二級快取 遇到的問題更新後查詢問題

最近碰到同事使用ibatis 和spring mvc,遇到了 update 後查詢 結果為未update前的資料,但是事物整體操作結束後資料是成功update了。最初懷疑是spring的事物傳播問題,以為是本類呼叫本類方法導致的.但是看了一下應用log,整體的sqlsess

Mybatis深入原始碼分析之基於裝飾模式純手寫一級二級三級快取

寫在前面:設計模式源於生活,而又高於生活! 什麼是裝飾者模式 在不改變原有物件的基礎上附加功能,相比生成子類更靈活。

MyBatis快取機制(一級快取二級快取

一,MyBatis一級快取(本地快取)   My Batis 一級快取存在於 SqlSession 的生命週期中,是SqlSession級別的快取。在操作資料庫時需要構造SqlSession物件,在物件中有一個數據結構用來儲存快取資料。不同的SqlSession之間的資料快取是不能共享的。   在同一個Sql

JAVA微服務架構高併發高效能高可用分散式叢集快取電商實戰教程下載

JAVA微服務架構,高併發,高效能,高可用,分散式,叢集,快取,電商實戰教程下載39套Java架構師,高併發,高效能,高可用,分散式,叢集,電商,快取,微服務,微信支付寶支付,公眾號開發,java8新特性,P2P金融專案,程式設計,功能設計,資料庫設計,第三方支付,web安全,效能調優,設計模式,資

JAVA架構師大型分散式高併發電商專案實戰效能優化叢集億級高併發web安全快取架構實戰

現任58到家技術委員會主席,高階技術總監,負責企業,支付,營銷、客戶關係等多個後端業務部門。本質,技術人一枚。網際網路架構技術專家,“架構師之路”公眾號作者。曾任百度高階工程師,58同城高階架構師,58同城技術委員會主席,58同城C2C技術部負責人。 內容介紹 1.大資

hibernate的CRUD持久化物件一級快取

CRUD 由於載入配置檔案等都是一樣的,所以提取工具類 public class HibernateUtils { public static final Configuration configuration; public static final SessionFactory

Java分散式快取這匹“野馬”你駕馭得了嗎?

俗話說得好,工欲善其事,必先利其器,有了好的工具肯定得知道如何用好這些工具,本篇將分為如下幾個方面介紹如何利用好快取: 你真的需要快取嗎 如何選擇合適的快取 多級快取 快取更新 快取挖坑三劍客 快取汙染 序列化 GC調優 快取的監控 一款好的框架 總結

Java分散式快取這匹“野馬”你駕馭得了嗎?

俗話說得好,工欲善其事,必先利其器,有了好的工具肯定得知道如何用好這些工具,本篇將分為如下幾個方面介紹如何利用好快取: 你真的需要快取嗎 如何選擇合適的快取 多級快取 快取更新 快取挖坑三劍客 快取汙染 序列化 GC調優 快取的監控 一款好的框架 總結

【陌上軒客】技術領域:涉獵Java、Go、Python、Groovy 等語言高效能、高併發、高可用、非同步與訊息中介軟體、快取與資料庫、分散式與微服務、容器自動化等領域; 興趣愛好:籃球騎行讀書發呆; 職業規劃:勵志成為一名出色的伺服器端系統架構師。

陌上軒客 技術領域:涉獵Java、Go、Python、Groovy 等語言,高效能、高併發、高可用、非同步與訊息中介軟體、快取與資料庫、分散式與微服務、容器和自動化等領域; 興趣愛好:籃球,騎行,讀書,發呆; 職業...

Nginx服務搭建負載均衡反向代理快取加速訪問分散式檔案系統高可用

主配置檔案如下:[[email protected]~]#vim /usr/local/nginx/conf/nginx.conf server{ listen 8099               //埠號 location / {      autoindex on;      autoinde