posts - 3,  comments - 2,  trackbacks - 0
          緣起: 在數據驅動的web開發中,經常要重復從數據庫中取出相同的數據,這種重復極大的增加了數據庫負載。緩存是解決這個問題的好辦法。 
          Memcached是什么? 
          Memcached是由Danga Interactive開發的,高性能的,分布式的內存對象緩存系統,用于在動態應用中減少數據庫負載,提升訪問速度。 

          Memcached能緩存什么? 
                 通過在內存里維護一個統一的巨大的hash表,Memcached能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。 

          Memcached快么? 
                 非??臁emcached使用了libevent(如果可以的話,在linux下使用epoll)來均衡任何數量的打開鏈接,使用非阻塞的網絡I/O,對內部對象實現引用計數(因此,針對多樣的客戶端,對象可以處在多樣的狀態), 使用自己的頁塊分配器和哈希表, 因此虛擬內存不會產生碎片并且虛擬內存分配的時間復雜度可以保證為O(1).。 
                 Danga Interactive為提升Danga Interactive的速度研發了Memcached。目前,LiveJournal.com每天已經在向一百萬用戶提供多達兩千萬次的頁面訪問。而這些,是由一個由web服務器和數據庫服務器組成的集群完成的。Memcached幾乎完全放棄了任何數據都從數據庫讀取的方式,同時,它還縮短了用戶查看頁面的速度、更好的資源分配方式,以及Memcache失效時對數據庫的訪問速度。 

          Memcached的特點 
                 Memcached的緩存是一種分布式的,可以讓不同主機上的多個用戶同時訪問, 因此解決了共享內存只能單機應用的局限,更不會出現使用數據庫做類似事情的時候,磁盤開銷和阻塞的發生。 

          Memcached的使用 
          一 、Memcached服務器端的安裝 (此處將其作為系統服務安裝) 
               下載文件:memcached 1.2.1 for Win32 binaries (Dec 23, 2006) 
             1 解壓縮文件到c:\memcached 
             2 命令行輸入 'c:\memcached\memcached.exe -d install' 
             3 命令行輸入 'c:\memcached\memcached.exe -d start' ,該命令啟動 Memcached ,默認監聽端口為 11211 
            通過 memcached.exe -h 可以查看其幫助 

          二、客戶端使用 
                下載memcached java client:http://www.whalin.com/memcached/#download 
             1 解壓后將java_memcached-release_2.0.1.jar jar包添加到工程的classpath中 
                 2 利用memcached java client 一個簡單的應用 
          Java代碼 復制代碼
          1. package com.danga.MemCached.test;      
          2.      
          3. import java.util.Date;      
          4.      
          5. import com.danga.MemCached.MemCachedClient;      
          6. import com.danga.MemCached.SockIOPool;      
          7.      
          8.      
          9. public class Test {          
          10.     protected static MemCachedClient mcc = new MemCachedClient();         
          11.          
          12.     static {         
          13.         String[] servers ={"192.168.40.4:12000"};         
          14.          
          15.         Integer[] weights = { 3 };         
          16.          
          17.         //創建一個實例對象SockIOPool       
          18.         SockIOPool pool = SockIOPool.getInstance();         
          19.          
          20.         // set the servers and the weights      
          21.         //設置Memcached Server      
          22.         pool.setServers( servers );         
          23.         pool.setWeights( weights );         
          24.          
          25.         // set some basic pool settings         
          26.         // 5 initial, 5 min, and 250 max conns         
          27.         // and set the max idle time for a conn         
          28.         // to 6 hours         
          29.         pool.setInitConn( 5 );         
          30.         pool.setMinConn( 5 );         
          31.         pool.setMaxConn( 250 );         
          32.         pool.setMaxIdle( 1000 * 60 * 60 * 6 );         
          33.          
          34.         // set the sleep for the maint thread         
          35.         // it will wake up every x seconds and         
          36.         // maintain the pool size         
          37.         pool.setMaintSleep( 30 );         
          38.          
          39.         // Tcp的規則就是在發送一個包之前,本地機器會等待遠程主機      
          40.                   // 對上一次發送的包的確認信息到來;這個方法就可以關閉套接字的緩存,      
          41.                   // 以至這個包準備好了就發;      
          42.                   pool.setNagle( false );         
          43.         //連接建立后對超時的控制      
          44.                   pool.setSocketTO( 3000 );      
          45.         //連接建立時對超時的控制      
          46.                   pool.setSocketConnectTO( 0 );         
          47.          
          48.         // initialize the connection pool         
          49.         //初始化一些值并與MemcachedServer段建立連接      
          50.                   pool.initialize();      
          51.                  
          52.          
          53.         // lets set some compression on for the client         
          54.         // compress anything larger than 64k         
          55.         mcc.setCompressEnable( true );         
          56.         mcc.setCompressThreshold( 64 * 1024 );         
          57.     }         
          58.              
          59.     public static void bulidCache(){         
          60.         //set(key,value,Date) ,Date是一個過期時間,如果想讓這個過期時間生效的話,這里傳遞的new Date(long date) 中參數date,需要是個大于或等于1000的值。      
          61.         //因為java client的實現源碼里是這樣實現的 expiry.getTime() / 1000 ,也就是說,如果 小于1000的值,除以1000以后都是0,即永不過期      
          62.         mcc.set( "test""This is a test String" ,new Date(11211));     
          63.     //十秒后過期      
          64.                 
          65.     }         
          66.         
          67.     public static void output() {         
          68.         //從cache里取值      
          69.         String value = (String) mcc.get( "test" );         
          70.         System.out.println(value);          
          71.     }         
          72.              
          73.     public static void main(String[] args){         
          74.         bulidCache();        
          75.         output();             
          76.     }       
          77.          
          78. }         
            posted on 2008-12-13 01:17 sw0rd 閱讀(5552) 評論(0)  編輯  收藏

            只有注冊用戶登錄后才能發表評論。


            網站導航:
             
            主站蜘蛛池模板: 平塘县| 淮南市| 韩城市| 信丰县| 长葛市| 龙泉市| 莫力| 兰州市| 东兴市| 巩留县| 固始县| 图木舒克市| 施甸县| 梓潼县| 大丰市| 霍邱县| 雷波县| 晋中市| 莱阳市| 安陆市| 泸溪县| 克什克腾旗| 临武县| 巫溪县| 红桥区| 额敏县| 噶尔县| 巨野县| 开化县| 呼伦贝尔市| 唐海县| 台湾省| 常宁市| 五原县| 中西区| 梁山县| 黔西县| 绩溪县| 蓬安县| 顺义区| 鹤壁市|