志當存高遠,功到自然成!

          少年強則中國強,少年進步則中國進步!

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            53 Posts :: 2 Stories :: 2 Comments :: 0 Trackbacks

          分布式緩存系統(tǒng)Memcached簡介與實踐

          http://blog.csdn.net/hitman9099/archive/2008/09/04/2878417.aspx

           

          緣起: 在數(shù)據(jù)驅動的web開發(fā)中,經(jīng)常要重復從數(shù)據(jù)庫中取出相同的數(shù)據(jù),這種重復極大的增加了數(shù)據(jù)庫負載。緩存是解決這個問題的好辦法。但是ASP.NET中的雖然已經(jīng)可以實現(xiàn)對頁面局部進行緩存,但還是不夠靈活。此時Memcached或許是你想要的。

          Memcached是什么?
          Memcached是由Danga Interactive開發(fā)的,高性能的,分布式的內存對象緩存系統(tǒng),用于在動態(tài)應用中減少數(shù)據(jù)庫負載,提升訪問速度。

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

          Memcached快么?

          非 ???。Memcached使用了libevent(如果可以的話,在linux下使用epoll)來均衡任何數(shù)量的打開鏈接,使用非阻塞的網(wǎng)絡I/O,對 內部對象實現(xiàn)引用計數(shù)(因此,針對多樣的客戶端,對象可以處在多樣的狀態(tài)), 使用自己的頁塊分配器和哈希表, 因此虛擬內存不會產(chǎn)生碎片并且虛擬內存分配的時間復雜度可以保證為O(1).。

          Danga Interactive為提升Danga Interactive的速度研發(fā)了Memcached。目前,LiveJournal.com每天已經(jīng)在向一百萬用戶提供多達兩千萬次的頁面訪問。而這 些,是由一個由web服務器和數(shù)據(jù)庫服務器組成的集群完成的。Memcached幾乎完全放棄了任何數(shù)據(jù)都從數(shù)據(jù)庫讀取的方式,同時,它還縮短了用戶查看 頁面的速度、更好的資源分配方式,以及Memcache失效時對數(shù)據(jù)庫的訪問速度。

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

          Memcached的使用 
           
          Memcached服務器端的安裝 (此處將其作為系統(tǒng)服務安裝)
          下載文件: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 ,默認監(jiān)聽端口為 11211
          通過 memcached.exe -h 可以查看其幫助

           

          一個簡單的測試例子

          1. package com.mapbar.util.cache;

          2. import java.util.Date;
          3. import java.util.ResourceBundle;

          4. import com.danga.MemCached.MemCachedClient;
          5. import com.danga.MemCached.SockIOPool;
          6. /**
          7.  * 使用配置文件方式的memcache組件
          8.  *
          9.  */
          10. public class Cache {

          11.  protected static ResourceBundle rb=ResourceBundle.getBundle("memcached");;
          12.  public static MemCachedClient mcc = new MemCachedClient(); 
          13.  static {
          14.   init();
          15.  }     
          16.  public static void init(){
          17.   synchronized (mcc) {  
          18.    System.out.println("init call");
          19.    String[] servers =rb.getString("cache.servers").split(",");       
          20.          
          21.          String[] strWeights =rb.getString("cache.weights").split(",");  
          22.          Integer[] weights = new Integer[strWeights.length];
          23.          for(int i=0;i<strWeights.length;i++){
          24.           weights[i]=Integer.parseInt(strWeights[i]);
          25.          }
          26.         
          27.          //創(chuàng)建一個實例對象SockIOPool     
          28.          SockIOPool pool = SockIOPool.getInstance();       
          29.         
          30.          // set the servers and the weights    
          31.          //設置Memcached Server    
          32.          pool.setServers( servers );       
          33.          pool.setWeights( weights );       
          34.          pool.setInitConn(Integer.parseInt(rb.getString("cache.initConn")));       
          35.          pool.setMinConn(Integer.parseInt(rb.getString("cache.minConn")));       
          36.          pool.setMaxConn(Integer.parseInt(rb.getString("cache.maxConn")));       
          37.          pool.setMaxIdle(Long.parseLong(rb.getString("cache.maxIdle")));       
          38.         
          39.          // set the sleep for the maint thread       
          40.          // it will wake up every x seconds and       
          41.          // maintain the pool size       
          42.          pool.setMaintSleep( 30 );       
          43.         
          44. //         Tcp的規(guī)則就是在發(fā)送一個包之前,本地機器會等待遠程主機    
          45. //         對上一次發(fā)送的包的確認信息到來;這個方法就可以關閉套接字的緩存,    
          46. //         以至這個包準備好了就發(fā);    
          47.          pool.setNagle( false );       
          48.          //連接建立后對超時的控制    
          49.          pool.setSocketTO( 3000 );    
          50.          //連接建立時對超時的控制    
          51.          pool.setSocketConnectTO( 0 );       
          52.         
          53.          // initialize the connection pool       
          54.          //初始化一些值并與MemcachedServer段建立連接    
          55.          pool.initialize();    

          56.          // lets set some compression on for the client       
          57.          // compress anything larger than 64k       
          58.          mcc.setCompressEnable( true );       
          59.          mcc.setCompressThreshold( 64 * 1024 );  
          60.   }
          61.  }
          62.  protected static void bulidCache(){  
          63.   
          64.         //set(key,value,Date) ,Date是一個過期時間,如果想讓這個過期時間生效的話,這里傳遞的new Date(long date) 中參數(shù)date,需要是個大于或等于1000的值。    
          65.         //因為java client的實現(xiàn)源碼里是這樣實現(xiàn)的 expiry.getTime() / 1000 ,也就是說,如果 小于1000的值,除以1000以后都是0,即永不過期    
          66.         mcc.set( "test""This is a test String" ,new Date(100000));   //十秒后過期    
          67.               
          68.     }       
          69.       
          70.  protected static void output() {       
          71.         //從cache里取值    
          72.         String value = (String) mcc.get( "test" );       
          73.         System.out.println(value);        
          74.     }       
          75.            
          76.  public static void main(String[] args){       
          77.         bulidCache();      
          78.         output();           
          79.     }        

          80. }


          其中在classespath下有個memcached.properties文件

          內容如下:

          ##muti servers spilt by ,

          #這里是你的memcached啟動的地址
          cache.servers=192.168.0.116:11211  
          cache.weights=1
          #memcached be used
          cache.cluster=true

          #set some basic pool settings       
          #5 initial, 5 min, and 250 max conns       
          #and set the max idle time for a conn       
          #to 6 hours  6*60*60*1000
          cache.initConn=5
          cache.minConn=5
          cache.maxConn=250
          cache.maxIdle=21600000

           

           

           

           

          在Windows下安裝Memcached

          http://www.oschina.net/docs/article/4

          很多phper不知道如何在Windows下搭建Memcache的開發(fā)調試環(huán)境,最近個人也在研究Memcache,記錄下自己安裝搭建的過程。
          其實我開始研究Memcache的時候并不知道居然還有memcached for Win32這個鳥東西,害得我在CnetOS下折騰1天才搞定,今天突然發(fā)現(xiàn)Windows下的Memcache進行開發(fā)調試完全沒有問題,所以寫篇 Memcache的文檔分享給大家。

          Windows下的Memcache安裝
          1. 下載memcache的 windows穩(wěn)定版,解壓放某個盤下面,比如在c:\memcached
          2. 在終端(也即cmd命令界面)下輸入 ‘c:\memcached\memcached.exe -d install’ 安裝
          3. 再輸入: ‘c:\memcached\memcached.exe -d start’ 啟動。NOTE: 以后memcached將作為windows的一個服務每次開機時自動啟動。這樣服務器端已經(jīng)安裝完畢了。
          4.下載php_memcache.dll, 請自己查找對應的php版本的文件
          5. 在C:\winnt\php.ini 加入一行 ‘extension=php_memcache.dll’
          6.重新啟動Apache,然后查看一下phpinfo,如果有memcache,那么就說明安裝成功!

          memcached的基本設置

          -p 監(jiān)聽的端口
          -l 連接的IP地址, 默認是本機
          -d start 啟動memcached服務
          -d restart 重起memcached服務
          -d stop|shutdown 關閉正在運行的memcached服務
          -d install 安裝memcached服務
          -d uninstall 卸載memcached服務
          -u 以的身份運行 (僅在以root運行的時候有效)
          -m 最大內存使用,單位MB。默認64MB
          -M 內存耗盡時返回錯誤,而不是刪除項
          -c 最大同時連接數(shù),默認是1024
          -f 塊大小增長因子,默認是1.25
          -n 最小分配空間,key+value+flags默認是48
          -h 顯示幫助

          Memcache環(huán)境測試
          運行下面的php文件,如果有輸出This is a test!,就表示環(huán)境搭建成功。開始領略Memcache的魅力把!
          < ?php
          $mem = new Memcache;
          $mem->connect(”127.0.0.1″, 11211);
          $mem->set(’key’, ‘This is a test!’, 0, 60);
          $val = $mem->get(’key’);
          echo $val;
          ?>

          主站蜘蛛池模板: 永川市| 中江县| 南靖县| 乌兰浩特市| 栾城县| 永城市| 汾西县| 正阳县| 翁牛特旗| 静海县| 七台河市| 许昌县| 益阳市| 三穗县| 涟源市| 甘肃省| 内江市| 梁平县| 宜阳县| 当涂县| 孟津县| 喀喇沁旗| 南投县| 靖远县| 榆林市| 乐业县| 兴国县| 饶阳县| 金堂县| 苍南县| 永善县| 余干县| 平安县| 衢州市| 思南县| 定兴县| 瑞金市| 宜黄县| 阜阳市| 射阳县| 淮阳县|