(一)memcached介紹css
(1) memcached是一個分佈式緩存工具。與咱們常常打交道的緩存技術,就是瀏覽器自帶的緩存,咱們知道像圖片、css、js等這些靜態文件就能被瀏覽器緩存起來。咱們再訪問相同網頁的時候,這些緩存的文件就直接找瀏覽器去取而再也不是請求服務器。減輕了服務器的壓力。數據庫
(2) 所謂靜態文件,顧名思義就是一些不常常更新的文件;可是咱們網站的內容都是動態的,所謂動態,也就是這些數據都是存儲在數據庫當中,每次請求都要向數據庫索取。請求數據庫也是磁盤操做,也是費時費力的。雖然說是動態,但還有一些東西在短期內也是不會更改的,而這些數據徹底能夠緩存起來。像購物網站分類導航。memcached正充當着這樣一個角色。瀏覽器
(3) memcached是分佈式的,也就是memcached服務端這個軟件能夠安裝到集羣服務器當中,抑或一臺服務器安裝好幾個memcached。這些memcached服務器是協同來處理用於請求的。所謂協同,就是每一個memcached都會分配一個權重,若是權重值較大被訪問到的概率也就大;若是權重值較小被訪問到的概率也就較小。緩存
(二)memcached服務端安裝服務器
(1) memcached服務端是用C語言來寫的。在官網上只給出了Linux的版本,好不容易在網上搜查到了Win32版本,連接發佈以下:socket
(2)將這個壓縮包解壓,就出來一個「鹿頭」的memcached.exe文件,沒錯!就是它了。運行它,會出現一個窗口,這個窗口一直打開着就說明memcached的服務端就一直運行着,那麼它就能接收客戶端的請求。客戶端就能夠自由發揮了,能夠用各類語言來實現,本文用Java做介紹。memcached
在網上查了一下,如今比較流行的Java客戶端一個是阿里的同窗寫的;另外一個就是老外寫的,順便在Git上將其下載下來看了一下源碼。源碼後面將介紹,如今只說應用。工具
這裏只介紹這個老外寫的Memcached Java客戶端,咱們須要下載memcached客戶端Jar包和其所依賴的Jar包.測試
(三)建立工程
(1)如今咱們就能夠開始咱們的項目了。建一個Memecached類,在其中提供向緩存當中存入數據和取數據的方法。(memcached服務端軟件默認運行端口爲:11211)
1 public class MemCached{ 2 private static MemCachedClient mcc=new MemCachedClient(); 3 private static MemCached memCached=new MemCached(); 4 5 //服務區羣 6 private static final String[] services={"192.168.56.1:11211"}; 7 //服務器羣各自對應的權重 8 private static final Integer[] weights={1}; 9 //初始化鏈接數 10 private static final Integer init_connection=5; 11 //最大鏈接數 12 private static final Integer max_connection=50; 13 //最大空閒時間 60*60*6 14 private static final Long max_idle=21600L; 15 16 17 static { 18 //獲取socket鏈接池的實例對象 19 SockIOPool pool=SockIOPool.getInstance(); 20 pool.setServers(services); 21 pool.setWeights(weights); 22 pool.setInitConn(init_connection); 23 pool.setMinConn(init_connection); 24 pool.setMaxConn(max_connection); 25 pool.setMaxIdle(max_idle); 26 27 //設置TCP的參數,鏈接超時等 28 pool.setNagle(false); 29 pool.setSocketTO(3000); 30 pool.setSocketConnectTO(0); 31 32 //初始化鏈接池 33 pool.initialize(); 34 35 //超過指定大小就壓縮 36 mcc.setCompressEnable(true); 37 mcc.setCompressThreshold(65536L); 38 } 39 40 private MemCached(){} 41 42 public static MemCached getInstance() { 43 return memCached; 44 } 45 46 public boolean add(String key,Object value) { 47 return mcc.add(key, value); 48 } 49 50 public boolean add(String key,Object value,Date expiry) { 51 return mcc.add(key,value, expiry); 52 } 53 54 public boolean replace(String key,Object value) { 55 return mcc.replace(key, value); 56 } 57 public boolean replace(String key,Object value,Date expiry) { 58 return mcc.replace(key,key,expiry); 59 } 60 61 public Object get(String key) { 62 return mcc.get(key); 63 } 64
(2)測試方法
1 public class Test { 2 public static void main(String[] args) { 3 MemCached cache=MemCached.getInstance(); 4 cache.add("username", "feiji"); 5 System.out.println("從緩存中取出的值爲:"+cache.get("username")); 6 } 7 8 }
這樣咱們就能將鍵爲「username」,值爲「feiji」的鍵值對存入到緩存當中又能從其中取出來。
而後咱們將第4行代碼刪掉,只要memcached服務端沒有關閉,仍是能查詢出來。
固然咱們還能夠爲這個存入的鍵值對加入過時時間。
這就比如一個應用場景,手機短信驗證碼。程序將驗證碼發給指定手機,這個驗證碼假設是在50S內有效。那麼這個驗證碼在這50S內顯然要能找到,確定不能用數據庫來存吧!!這時memcached就派上用場了。
測試代碼以下:
1 public class Test { 2 public static void main(String[] args) { 3 MemCached cache=MemCached.getInstance(); 4 long now=System.currentTimeMillis(); 5 long expiry=now+1000*50; 6 Date date=new Date(expiry); 7 cache.add("username", "feiji", date); 8 System.out.println("從緩存中取出的值爲:"+cache.get("username")); 9 } 10 }