java中緩存的原理

外存:java

  也就是咱們常常說的(CDEF盤的大小)外儲存器是指除計算機內存及CPU緩存之外的儲存器,此類儲存器通常斷電後仍然能保存數據。常見的外存儲器有硬盤、軟盤、光盤、U盤等,通常的軟件都是安裝在外存中數據庫

內存:緩存

  內存是計算機中重要的部件之一,它是與CPU進行溝通的橋樑。計算機中全部程序的運行都是在內存中進行的,所以內存的性能對計算機的影響很是大。內存(Memory)也被稱爲內存儲器,其做用是用於暫時存放CPU中的運算數據,以及與硬盤等外部存儲器交換的數據。只要計算機在運行中,CPU就會把須要運算的數據調到內存中進行運算,當運算完成後CPU再將結果傳送出來,內存的運行也決定了計算機的穩定運行,此類儲存器通常斷電後數據就會被清空框架

高速緩存:性能

  高速緩存是用來協調CPU與主存之間存取速度的差別而設置的。通常狀況下,CPU的工做速度高,但內存的工做速度相對較低,爲了解決這個問題,一般使用高速緩存,高速緩存的存取速度介於CPU和主存之間。系統將一些CPU在近幾個時間段常常訪問的內容存入高速緩衝,當CPU須要使用數據時,先在高速緩存中找,若是找到,就沒必要訪問內存了,找不到時,再找內存,這樣就在必定程度上緩解了因爲主存速度低形成的CPU「停工待料」的狀況spa

---------------------------------------------------------------------------------------------------------------------------code

  以前一直很不理解這個緩存那個緩存,其實緩存就是把一些外存上的數據保存到內存上而已,怎麼保存到內存上呢,咱們運行的全部程序,裏面的變量值都是放在內存上的,因此說若是要想使一個值放到內存上,實質就是在得到這個變量以後,用一個生存期較長的變量存放你想存放的值,在java中一些緩存通常都是經過map集合來作的。 blog

在Java中常常用到緩存,在SSh框架中也會用到一級緩存和二級緩存,到底緩存是怎麼實現的呢?內存

  簡單講就是,若是某些資源或者數據會被頻繁的使用,而這些資源或數據存儲在系統外部,好比數據庫、硬盤文件等,那麼每次操做這些數據的時候都從數據庫或者硬盤上去獲取,速度會很慢,會形成性能問題。
  一個簡單的解決方法就是:把這些數據緩存到內存裏面,每次操做的時候,先到內存裏面找,看有沒有這些數據,若是有,那麼就直接使用,若是沒有那麼就獲取它,並設置到緩存中,下一次訪問的時候就能夠直接從內存中獲取了。從而節省大量的時間,固然,緩存是一種典型的空間換時間的方案。資源

  在Java中最多見的一種實現緩存的方式就是使用Map, 基本的步驟是:
     先到緩存裏面查找,看看是否存在須要使用的數據
    若是沒有找到,那麼就建立一個知足要求的數據,而後把這個數據設置回到緩存中,以備下次使用
     若是找到了相應的數據,或者是建立了相應的數據,那就直接使用這個數據。

/**
* Java中緩存的基本實現示例
*/
public class JavaCache {
    /**
    * 緩存數據的容器,定義成Map是方便訪問,直接根據Key就能夠獲取Value了
    * key選用String是爲了簡單,方便演示
    */
    private Map<String,Object> map = new HashMap<String,Object>();
    /**
    * 從緩存中獲取值
    
    * @param key 設置時候的key值
    * @return key對應的Value值
    */
    public Object getValue(String key){
        //先從緩存裏面取值
        Object obj = map.get(key);
        //判斷緩存裏面是否有值
        if(obj == null){
            //若是沒有,那麼就去獲取相應的數據,好比讀取數據庫或者文件
            //這裏只是演示,因此直接寫個假的值
            obj = key+",value";
            //把獲取的值設置回到緩存裏面
            map.put(key, obj);
        }
        //若是有值了,就直接返回使用
        return obj;
    }
}

  這裏只是緩存的基本實現,還有不少功能都沒有考慮,好比緩存的清除,緩存的同步等等。固然,Java的緩存還有不少實現方式,也是很是複雜的,如今有不少專業的緩存框架,更多緩存的知識,這裏就再也不去討論了。
下面用單例模式實現緩存:

/**
* 使用緩存來模擬實現單例
*/
public class Singleton {
    /**
    * 定義一個缺省的key值,用來標識在緩存中的存放
    */
    private final static String DEFAULT_KEY = "One";
    /**
    * 緩存實例的容器
    */
    private static Map<String,Singleton> map =
    new HashMap<String,Singleton>();
    /**
    * 私有化構造方法
    */
    private Singleton(){
    //
    }
    public static Singleton getInstance(){
        //先從緩存中獲取
        Singleton instance = (Singleton)map.get(DEFAULT_KEY);
        //若是沒有,就新建一個,而後設置回緩存中
        if(instance==null){
            instance = new Singleton();
            map.put(DEFAULT_KEY, instance);
        }
        //若是有就直接使用
        return instance;
    }
}
相關文章
相關標籤/搜索