外存:
也就是我們經常說的(CDEF盤的大小)外儲存器是指除計算機記憶體及CPU緩存以外的儲存器,此類儲存器一般斷電後仍然能儲存資料。常見的外存儲器有硬碟、軟碟、CD光牒、U盤等,一般的軟體都是安裝在外存中
記憶體:
記憶體是計算機中重要的部件之一,它是與CPU進行溝通的橋梁。計算機中所有程式的運作都是在記憶體中進行的,是以記憶體的性能對計算機的影響非常大。記憶體(Memory)也被稱為記憶體儲器,其作用是用于暫時存放CPU中的運算資料,以及與硬碟等外部存儲器交換的資料。隻要計算機在運作中,CPU就會把需要運算的資料調到記憶體中進行運算,當運算完成後CPU再将結果傳送出來,記憶體的運作也決定了計算機的穩定運作,此類儲存器一般斷電後資料就會被清空
高速緩存:
高速緩存是用來協調CPU與主存之間存取速度的差異而設定的。一般情況下,CPU的工作速度高,但記憶體的工作速度相對較低,為了解決這個問題,通常使用高速緩存,高速緩存的存取速度介于CPU和主存之間。系統将一些CPU在近幾個時間段經常通路的内容存入高速緩沖,當CPU需要使用資料時,先在高速緩存中找,如果找到,就不必通路記憶體了,找不到時,再找記憶體,這樣就在一定程度上緩解了由于主存速度低造成的CPU“停工待料”的情況
---------------------------------------------------------------------------------------------------------------------------
之前一直很不了解這個緩存那個緩存,其實緩存就是把一些外存上的資料儲存到記憶體上而已,怎麼儲存到記憶體上呢,我們運作的所有程式,裡面的變量值都是放在記憶體上的,是以說如果要想使一個值放到記憶體上,實質就是在獲得這個變量之後,用一個生存期較長的變量存放你想存放的值,在java中一些緩存一般都是通過map集合來做的。
在Java中經常用到緩存,在SSh架構中也會用到一級緩存和二級緩存,到底緩存是怎麼實作的呢?
簡單講就是,如果某些資源或者資料會被頻繁的使用,而這些資源或資料存儲在系統外部,比如資料庫、硬碟檔案等,那麼每次操作這些資料的時候都從資料庫或者硬碟上去擷取,速度會很慢,會造成性能問題。
一個簡單的解決方法就是:把這些資料緩存到記憶體裡面,每次操作的時候,先到記憶體裡面找,看有沒有這些資料,如果有,那麼就直接使用,如果沒有那麼就擷取它,并設定到緩存中,下一次通路的時候就可以直接從記憶體中擷取了。進而節省大量的時間,當然,緩存是一種典型的空間換時間的方案。
在Java中最常見的一種實作緩存的方式就是使用Map, 基本的步驟是:
1.先到緩存裡面查找,看看是否存在需要使用的資料
2.如果沒有找到,那麼就建立一個滿足要求的資料,然後把這個資料設定回到緩存中,以備下次使用
3.如果找到了相應的資料,或者是建立了相應的資料,那就直接使用這個資料。

/**
* 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;
}
}
