锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成AV人片在,亚洲国产综合无码一区,国产亚洲精品VA片在线播放http://www.tkk7.com/czihong/category/51442.htmlzh-cnTue, 30 Apr 2013 22:12:45 GMTTue, 30 Apr 2013 22:12:45 GMT60memcached 瀹㈡埛绔唬鐮?Java memcached client瀛︿範http://www.tkk7.com/czihong/articles/398082.htmlChan ChenChan ChenFri, 19 Apr 2013 04:16:00 GMThttp://www.tkk7.com/czihong/articles/398082.htmlhttp://www.tkk7.com/czihong/comments/398082.htmlhttp://www.tkk7.com/czihong/articles/398082.html#Feedback0http://www.tkk7.com/czihong/comments/commentRss/398082.htmlhttp://www.tkk7.com/czihong/services/trackbacks/398082.htmlRefer to:http://makemyownlife.iteye.com/blog/1439581

java memcached client
婧愮爜錛屾葷殑浠g爜閲忚繕鏄緢灝戠殑 
涓昏鏄涓嬩袱涓被: 
MemcachedClient.java 
SockIOPool.java

濂?鍏堢湅鎺ㄨ崘鐨勬祴璇曚唬鐮? 
Java浠g爜  鏀惰棌浠g爜
/** 
 * Copyright (c) 2008 Greg Whalin 
 * All rights reserved. 
 * 
 * This library is free software; you can redistribute it and/or 
 * modify it under the terms of the BSD license 
 * 
 * This library is distributed in the hope that it will be 
 * useful, but WITHOUT ANY WARRANTY; without even the implied 
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
 * PURPOSE. 
 * 
 * You should have received a copy of the BSD License along with this 
 * library. 
 * 
 * 
@author greg whalin <greg@meetup.com>  
 
*/  
package com.meetup.memcached.test;  
  
import com.meetup.memcached.*;  
import org.apache.log4j.*;  
  
public class TestMemcached  {    
    public static void main(String[] args) {  
              // memcached should be running on port 11211 but NOT on 11212  
  
        BasicConfigurator.configure();  
        String[] servers = { "localhost:11211"};  
        SockIOPool pool = SockIOPool.getInstance();  
        pool.setServers( servers );  
        pool.setFailover( true );  
        pool.setInitConn( 10 );   
        pool.setMinConn( 5 );  
        pool.setMaxConn( 250 );  
        pool.setMaintSleep( 30 );  
          //榪欐槸寮鍚竴涓猲agle 綆楁硶銆傛敼綆楁硶閬垮厤緗戠粶涓厖濉炲皬灝佸寘錛屾彁楂樼綉緇滅殑鍒╃敤鐜?nbsp; 
        pool.setNagle( false );  
        pool.setSocketTO( 3000 );  
        pool.setAliveCheck( true );  
        pool.initialize();  
  
        MemcachedClient mcc = new MemcachedClient();  
  
        // turn off most memcached client logging:  
        com.meetup.memcached.Logger.getLogger( MemcachedClient.class.getName() ).setLevel( com.meetup.memcached.Logger.LEVEL_WARN );  
  
        for ( int i = 0; i < 10; i++ ) {  
            boolean success = mcc.set( "" + i, "Hello!" );  
            String result = (String)mcc.get( "" + i );  
            System.out.println( String.format( "set( %d ): %s", i, success ) );  
            System.out.println( String.format( "get( %d ): %s", i, result ) );  
        }  
  
}  
鍏跺疄 瀵逛簬鎴戞潵璇?鎴戝緢鎯蟲槑鐧界殑鏄繛鎺ユ睜鏄浣曢厤緗殑,鍏抽敭鍦ㄤ簬 pool.initialize(); 榪欎釜鏂規硶濡備綍鍒濆鍖栫殑銆?nbsp;

Java浠g爜  鏀惰棌浠g爜
/**  
     * Initializes the pool.  
     
*/  
    public void initialize() {  
  
        synchronizedthis ) {  
  
            // check to see if already initialized  
            if ( initialized  
                    && ( buckets != null || consistentBuckets != null )  
                    && ( availPool != null )  
                    && ( busyPool != null ) ) {  
                log.error( "++++ trying to initialize an already initialized pool" );  
                return;  
            }  
  
            // pools  
            availPool   = new HashMap<String,Map<SockIO,Long>>( servers.length * initConn );  
            busyPool    = new HashMap<String,Map<SockIO,Long>>( servers.length * initConn );  
            deadPool    = new IdentityHashMap<SockIO,Integer>();  
  
            hostDeadDur = new HashMap<String,Long>();  
            hostDead    = new HashMap<String,Date>();  
            maxCreate   = (poolMultiplier > minConn) ? minConn : minConn / poolMultiplier;       // only create up to maxCreate connections at once  
  
            if ( log.isDebugEnabled() ) {  
                log.debug( "++++ initializing pool with following settings:" );  
                log.debug( "++++ initial size: " + initConn );  
                log.debug( "++++ min spare   : " + minConn );  
                log.debug( "++++ max spare   : " + maxConn );  
            }  
  
            // if servers is not set, or it empty, then  
            
// throw a runtime exception  
            if ( servers == null || servers.length <= 0 ) {  
                log.error( "++++ trying to initialize with no servers" );  
                throw new IllegalStateException( "++++ trying to initialize with no servers" );  
            }  
  
            // initalize our internal hashing structures  
            if ( this.hashingAlg == CONSISTENT_HASH )  
                populateConsistentBuckets();  
            else  
                populateBuckets();  
  
            // mark pool as initialized  
            this.initialized = true;  
  
            // start maint thread  
            if ( this.maintSleep > 0 )  
                this.startMaintThread();  
        }  
    }  
濡備笂浠g爜嫻佺▼濡備笅錛?nbsp;
1  媯嫻嬫槸鍚﹀凡緇忚鍒濆鍖?nbsp;
2  瀹氫箟鍙敤閾炬帴 錛岀箒蹇欓摼鎺ユ睜 
3  鍒ゆ柇鏄惁涓鑷存ash綆楁硶 榪樻槸鏅氱殑綆楁硶 
4  瀹氫箟涓涓悗鍙扮嚎紼?錛屾潵緇存姢 
濂?錛岄鍏堟潵鍒嗘瀽涓嬩竴鑷存ash綆楁硶銆?nbsp;

浠庡涓嬩唬鐮佹潵鍒嗘瀽 錛?nbsp;
Java浠g爜  鏀惰棌浠g爜
  if (   
         this.hashingAlg == CONSISTENT_HASH )  
        populateConsistentBuckets();  
}

Java浠g爜  鏀惰棌浠g爜
/** 灝唖erver娣誨姞鍒頒竴鑷存ash鐨?鐨?2嬈?nbsp;鍦嗙幆  **/  
    private void populateConsistentBuckets() {  
        if ( log.isDebugEnabled() )  
            log.debug( "++++ initializing internal hashing structure for consistent hashing" );  
  
        // store buckets in tree map   
        this.consistentBuckets = new TreeMap<Long,String>();  
  
        MessageDigest md5 = MD5.get();  
        //寰楀埌鎬葷殑鏉冮噸  
        if ( this.totalWeight <= 0 && this.weights !=  null ) {  
            for ( int i = 0; i < this.weights.length; i++ )  
                this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];  
        }  
        else if ( this.weights == null ) {  
            this.totalWeight = this.servers.length;  
        }  
          
      
        for ( int i = 0; i < servers.length; i++ ) {  
            //姣忓彴鏈嶅姟鍣ㄧ殑鏉冮噸  
            int thisWeight = 1;  
            if ( this.weights != null && this.weights[i] != null ) {  
                thisWeight = this.weights[i];  
            }  
              
            //鏈夊叴瓚g殑鏈嬪弸鍙互鍙傝冨鉤琛ash 綆楁硶鐨勫彟涓涓寚鏍囨槸騫寵 鎬?nbsp;(Balance) 錛屽畾涔夊涓嬶細    騫寵 鎬с騫寵 鎬ф槸鎸囧搱甯岀殑緇撴灉鑳藉灝藉彲鑳藉垎甯冨埌鎵鏈夌殑緙撳啿涓幓錛岃繖鏍峰彲浠ヤ嬌寰楁墍鏈夌殑緙撳啿絀洪棿閮藉緱鍒板埄鐢?nbsp; 
            
//浜嗚В鍐寵繖縐嶆儏鍐碉紝 consistent hashing 寮曞叆浜?#8220;铏氭嫙鑺傜偣”鐨勬蹇碉紝瀹冨彲浠ュ涓嬪畾涔夛細 “铏氭嫙鑺傜偣”錛?nbsp;virtual node 錛夋槸瀹為檯鑺傜偣鍦?nbsp;hash 絀洪棿鐨勫鍒跺搧錛?nbsp;replica 錛夛紝涓瀹為檯涓妭鐐瑰搴斾簡鑻ュ共涓?#8220;铏氭嫙鑺傜偣”錛岃繖涓搴斾釜鏁頒篃鎴愪負“澶嶅埗涓暟”錛?#8220;铏氭嫙鑺傜偣”鍦?nbsp;hash 絀洪棿涓互 hash 鍊兼帓鍒椼?nbsp; 
            double factor = Math.floor(((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight);  
              
            for ( long j = 0; j < factor; j++ ) { //鍔犲瘑瑙勫垯綾諱技 127.0.0.1_1    
                byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() ); //杞寲鎴?6浣嶇殑瀛楄妭鏁扮粍  
                
//16浣嶄簩榪涘埗鏁扮粍姣?浣嶄負涓緇勶紝姣忕粍絎?涓煎乏縐?4浣嶏紝絎笁涓煎乏縐?6浣嶏紝絎簩涓煎乏縐?浣嶏紝絎竴涓間笉縐諱綅銆傝繘琛屾垨榪愮畻錛屽緱鍒頒竴涓皬浜?鐨?2 嬈℃柟鐨刲ong鍊?nbsp; 
                for ( int h = 0 ; h < 4; h++ ) { //鍥犱負鏄?6浣?nbsp;  
                    Long k =  //瀹為檯涓婃瘡涓瓧鑺傝繘琛屼簡榪愮畻  
                          ((long)(d[3+h*4]&0xFF) << 24)   
                        | ((long)(d[2+h*4]&0xFF) << 16)   
                        | ((long)(d[1+h*4]&0xFF) << 8)    
                        | ((long)(d[0+h*4]&0xFF));  
  
                    consistentBuckets.put( k, servers[i] );  
                    if ( log.isDebugEnabled() )  
                        log.debug( "++++ added " + servers[i] + " to server bucket" );  
                }                 
            }  
              
              
  
            // create initial connections  
            if ( log.isDebugEnabled() )  
                log.debug( "+++ creating initial connections (" + initConn + ") for host: " + servers[i] );  
  
            //鍒涘緩閾炬帴  
            for ( int j = 0; j < initConn; j++ ) {  
                SockIO socket = createSocket( servers[i] );  
                if ( socket == null ) {  
                    log.error( "++++ failed to create connection to: " + servers[i] + " -- only " + j + " created." );  
                    break;  
                }  
                //鍔犲叆socket鍒拌繛鎺ユ睜 榪欓噷鎱㈡參璋?nbsp; 
                addSocketToPool( availPool, servers[i], socket );  
                if ( log.isDebugEnabled() )  
                    log.debug( "++++ created and added socket: " + socket.toString() + " for host " + servers[i] );  
            }  
        }  
          
    }  
濂?姣斿璇?鎴戜滑璋冪敤浜?濡備笅浠g爜: 
Java浠g爜  鏀惰棌浠g爜
MemcachedClient mcc = new MemcachedClient();  
mcc.set("6", 1);  

榪欓噷key 濡備綍瀹氫綅鍒頒竴鍙皊erver鍛紵鎴戝厛鎶婁竴鑷存ash綆楁硶鐨勫畾浣嶆柟娉曡涓嬨?nbsp;
Java浠g爜  鏀惰棌浠g爜
//寰楀埌瀹氫綅server鐨凷ocket灝佽瀵硅薄  
SockIOPool.SockIO sock = pool.getSock( key, hashCode );  

Java浠g爜  鏀惰棌浠g爜
//璁$畻鍑簁ey瀵瑰簲鐨刪ash鍊?md5) 錛岀劧鍚?nbsp; 
long bucket = getBucket( key, hashCode );  

Java浠g爜  鏀惰棌浠g爜 
//寰楀埌澶т簬hash鐨刴ap錛屽洜涓簍reemap宸茬粡鎺掑ソ搴忎簡銆傝皟鐢╰ailMap鍙互寰楀埌澶т簬絳変簬榪欎釜hash鐨勫璞?nbsp;錛岀劧鍚庤皟鐢╢irstKey寰楀埌鍦嗙幆涓婄殑hash鍊?nbsp; 
SortedMap<Long,String> tmap =  
            this.consistentBuckets.tailMap( hv );  
        return ( tmap.isEmpty() ) ? this.consistentBuckets.firstKey() : tmap.firstKey();  



Chan Chen 2013-04-19 12:16 鍙戣〃璇勮
]]>
Memcached瀹炵幇鍐呭瓨緙撳瓨(涓)http://www.tkk7.com/czihong/articles/375295.htmlChan ChenChan ChenThu, 19 Apr 2012 09:36:00 GMThttp://www.tkk7.com/czihong/articles/375295.htmlhttp://www.tkk7.com/czihong/comments/375295.htmlhttp://www.tkk7.com/czihong/articles/375295.html#Feedback0http://www.tkk7.com/czihong/comments/commentRss/375295.htmlhttp://www.tkk7.com/czihong/services/trackbacks/375295.html
Memcached鏄痙anga.com錛堣繍钀iveJournal鐨勬妧鏈洟闃燂級寮鍙戠殑涓濂楀垎甯冨紡鍐呭瓨瀵硅薄緙撳瓨緋葷粺錛岀敤浜庡湪鍔ㄦ佺郴緇熶腑鍑忓皯鏁版嵁搴撹礋杞斤紝鎻愬崌鎬ц兘銆侺J姣忕鍔ㄦ侀〉闈㈣闂噺鍑犲崈嬈★紝鐢ㄦ埛700涓囥侻emcached灝嗘暟鎹簱璐熻澆澶у箙搴﹂檷浣庯紝鏇村ソ鐨勫垎閰嶈祫婧愶紝鏇村揩閫熻闂?/span>

    鍏充簬榪欎釜涓滆タ錛岀浉淇″緢澶氫漢閮界敤榪囷紝鏈枃鎰忓湪閫氳繃瀵筸emcached鐨勫疄鐜板強浠g爜鍒嗘瀽錛岃幏寰楀榪欎釜鍑鴻壊鐨勫紑婧愯蔣浠舵洿娣卞叆鐨勪簡瑙o紝騫跺彲浠ユ牴鎹垜浠殑闇瑕佸鍏惰繘琛屾洿榪涗竴姝ョ殑浼樺寲銆傛湯浜嗗皢閫氳繃瀵笲SM_Memcache鎵╁睍鐨勫垎鏋愶紝鍔犳繁瀵?memcached鐨勪嬌鐢ㄦ柟寮忕悊瑙c傘?/span>

1.Memcached鏄粈涔?/span>

鍦ㄩ槓榪拌繖涓棶棰樹箣鍓嶏紝鎴戜滑棣栧厛瑕佹竻妤氬畠“涓嶆槸浠涔?#8221;銆傚緢澶氫漢鎶婂畠褰撲綔鍜孲haredMemory閭g褰㈠紡鐨勫瓨鍌ㄨ澆浣撴潵浣跨敤錛岃櫧鐒秏emcached浣跨敤浜嗗悓鏍風殑“Key=>Value”鏂瑰紡緇勭粐鏁版嵁錛屼絾鏄畠鍜屽叡浜唴瀛樸丄PC絳夋湰鍦扮紦瀛樻湁闈炲父澶х殑鍖哄埆銆侻emcached鏄垎甯冨紡鐨勶紝涔熷氨鏄瀹冧笉鏄湰鍦扮殑銆傚畠鍩轟簬緗戠粶榪炴帴錛堝綋鐒跺畠涔熷彲浠ヤ嬌鐢╨ocalhost錛夋柟寮忓畬鎴愭湇鍔★紝鏈韓瀹冩槸涓涓嫭绔嬩簬搴旂敤鐨勭▼搴忔垨瀹堟姢榪涚▼錛圖aemon鏂瑰紡錛夈傚嵆Memcached鏄珮鎬ц兘鐨勶紝鍒嗗竷寮忕殑鍐呭瓨瀵硅薄緙撳瓨緋葷粺錛岀敤浜庡湪鍔ㄦ佸簲鐢ㄤ腑鍑忓皯鏁版嵁搴撹礋杞斤紝鎻愬崌璁塊棶閫熷害銆?/span>

Memcached 浣跨敤libevent搴撳疄鐜扮綉緇滆繛鎺ユ湇鍔★紝鐞嗚涓婂彲浠ュ鐞嗘棤闄愬鐨勮繛鎺ワ紝浣嗘槸瀹冨拰Apache涓嶅悓錛屽畠鏇村鐨勬椂鍊欐槸闈㈠悜紼沖畾鐨勬寔緇繛鎺ョ殑錛屾墍浠ュ畠瀹為檯鐨勫茍鍙戣兘鍔涙槸鏈夐檺鍒剁殑銆傚湪淇濆畧鎯呭喌涓媘emcached鐨勬渶澶у悓鏃惰繛鎺ユ暟涓?00錛岃繖鍜孡inux綰跨▼鑳藉姏鏈夊叧緋伙紝榪欎釜鏁板兼槸鍙互璋冩暣鐨勩傚叧浜?libevent鍙互鍙傝冪浉鍏蟲枃妗c?Memcached鍐呭瓨浣跨敤鏂瑰紡涔熷拰APC涓嶅悓銆侫PC鏄熀浜庡叡浜唴瀛樺拰MMAP鐨勶紝memcachd鏈夎嚜宸辯殑鍐呭瓨鍒嗛厤綆楁硶鍜岀鐞嗘柟寮忥紝瀹冨拰鍏變韓鍐呭瓨娌℃湁鍏崇郴錛屼篃娌℃湁鍏變韓鍐呭瓨鐨勯檺鍒訛紝閫氬父鎯呭喌涓嬶紝姣忎釜memcached榪涚▼鍙互綆$悊2GB鐨勫唴瀛樼┖闂達紝濡傛灉闇瑕佹洿澶氱殑絀洪棿錛屽彲浠ュ鍔犺繘紼嬫暟銆?/span>

2. Memcached閫傚悎浠涔堝満鍚?/span>

鍦ㄥ緢澶氭椂鍊欙紝memcached閮借婊ョ敤浜嗭紝榪欏綋鐒跺皯涓嶄簡瀵瑰畠鐨勬姳鎬ㄣ傛垜緇忓父鍦ㄨ鍧涗笂鐪嬭鏈変漢鍙戣創錛岀被浼間簬“濡備綍鎻愰珮鏁堢巼”錛屽洖澶嶆槸“鐢╩emcached”錛岃嚦浜庢庝箞鐢紝鐢ㄥ湪鍝噷錛岀敤鏉ュ共浠涔堜竴鍙ユ病鏈夈俶emcached涓嶆槸涓囪兘鐨勶紝瀹冧篃涓嶆槸閫傜敤鍦ㄦ墍鏈夊満鍚堛?/span>

Memcached 鏄?#8220;鍒嗗竷寮?#8221;鐨勫唴瀛樺璞$紦瀛樼郴緇燂紝閭d箞灝辨槸璇達紝閭d簺涓嶉渶瑕?#8220;鍒嗗竷”鐨勶紝涓嶉渶瑕佸叡浜殑錛屾垨鑰呭共鑴嗚妯″皬鍒板彧鏈変竴鍙版湇鍔″櫒鐨勫簲鐢紝 memcached涓嶄細甯︽潵浠諱綍濂藉錛岀浉鍙嶈繕浼氭嫋鎱㈢郴緇熸晥鐜囷紝鍥犱負緗戠粶榪炴帴鍚屾牱闇瑕佽祫婧愶紝鍗充嬌鏄疷NIX鏈湴榪炴帴涔熶竴鏍楓傚湪鎴戜箣鍓嶇殑嫻嬭瘯鏁版嵁涓樉紺猴紝 memcached鏈湴璇誨啓閫熷害瑕佹瘮鐩存帴PHP鍐呭瓨鏁扮粍鎱㈠嚑鍗佸嶏紝鑰孉PC銆佸叡浜唴瀛樻柟寮忛兘鍜岀洿鎺ユ暟緇勫樊涓嶅銆傚彲瑙侊紝濡傛灉鍙槸鏈湴綰х紦瀛橈紝浣跨敤 memcached鏄潪甯鎬笉鍒掔畻鐨勩?/span>

 Memcached鍦ㄥ緢澶氭椂鍊欓兘鏄綔涓烘暟鎹簱鍓嶇cache浣跨敤鐨勩傚洜涓哄畠姣旀暟鎹簱灝戜簡寰堝SQL瑙f瀽銆佺鐩樻搷浣滅瓑寮閿錛岃屼笖瀹冩槸浣跨敤鍐呭瓨鏉ョ鐞嗘暟鎹殑錛屾墍浠ュ畠鍙互鎻愪緵姣旂洿鎺ヨ鍙栨暟鎹簱鏇村ソ鐨勬ц兘錛屽湪澶у瀷緋葷粺涓紝璁塊棶鍚屾牱鐨勬暟鎹槸寰堥綣佺殑錛?memcached鍙互澶уぇ闄嶄綆鏁版嵁搴撳帇鍔涳紝浣跨郴緇熸墽琛屾晥鐜囨彁鍗囥傚彟澶栵紝memcached涔熺粡甯鎬綔涓烘湇鍔″櫒涔嬮棿鏁版嵁鍏變韓鐨勫偍濯掍粙錛屼緥濡傚湪SSO緋葷粺涓繚瀛樼郴緇熷崟鐐圭櫥闄嗙姸鎬佺殑鏁版嵁灝卞彲浠ヤ繚瀛樺湪memcached涓紝琚涓簲鐢ㄥ叡浜?/span>

闇瑕佹敞鎰忕殑鏄紝memcached浣跨敤鍐呭瓨綆$悊鏁版嵁錛屾墍浠ュ畠鏄槗澶辯殑錛屽綋鏈嶅姟鍣ㄩ噸鍚紝鎴栬卪emcached榪涚▼涓錛屾暟鎹究浼氫涪澶憋紝鎵浠?memcached涓嶈兘鐢ㄦ潵鎸佷箙淇濆瓨鏁版嵁銆傚緢澶氫漢鐨勯敊璇悊瑙o紝memcached鐨勬ц兘闈炲父濂斤紝濂藉埌浜嗗唴瀛樺拰紜洏鐨勫姣旂▼搴︼紝鍏跺疄memcached浣跨敤鍐呭瓨騫朵笉浼氬緱鍒版垚鐧句笂鍗冪殑璇誨啓閫熷害鎻愰珮錛屽畠鐨勫疄闄呯摱棰堝湪浜庣綉緇滆繛鎺ワ紝瀹冨拰浣跨敤紓佺洏鐨勬暟鎹簱緋葷粺鐩告瘮錛屽ソ澶勫湪浜庡畠鏈韓闈炲父“杞?#8221;錛屽洜涓烘病鏈夎繃澶氱殑寮閿鍜岀洿鎺ョ殑璇誨啓鏂瑰紡錛屽畠鍙互杞繪澗搴斾粯闈炲父澶х殑鏁版嵁浜ゆ崲閲忥紝鎵浠ョ粡甯鎬細鍑虹幇涓ゆ潯鍗冨厗緗戠粶甯﹀閮芥弧璐熻嵎浜嗭紝memcached榪涚▼鏈韓騫朵笉鍗犵敤澶氬皯CPU璧勬簮鐨勬儏鍐點?/span>

閫氬父鐨勭綉欏電紦瀛樻柟寮忔湁鍔ㄦ佺紦瀛樺拰闈欐佺紦瀛樼瓑鍑犵錛屽湪ASP.NET涓凡緇忓彲浠ュ疄鐜板欏甸潰灞閮ㄨ繘琛岀紦瀛橈紝鑰屼嬌鐢╩emcached鐨勭紦瀛樻瘮 ASP.NET鐨勫眬閮ㄧ紦瀛樻洿鍔犵伒媧伙紝鍙互緙撳瓨浠繪剰鐨勫璞★紝涓嶇鏄惁鍦ㄩ〉闈笂杈撳嚭銆傝宮emcached鏈澶х殑浼樼偣鏄彲浠ュ垎甯冨紡鐨勯儴緗詫紝榪欏浜庡ぇ瑙勬ā搴旂敤鏉ヨ涔熸槸蹇呬笉鍙皯鐨勮姹傘?/span>

LiveJournal.com浣跨敤浜唌emcached鍦ㄥ墠绔繘琛岀紦瀛橈紝鍙栧緱浜嗚壇濂界殑鏁堟灉錛岃屽儚wikipedia,sourceforge絳変篃閲囩敤浜嗘垨鍗沖皢閲囩敤memcached浣滀負緙撳瓨宸ュ叿銆俶emcached鍙互澶ц妯$綉绔欏簲鐢ㄥ彂鎸ュ法澶х殑浣滅敤銆?/span>

2.1 memcached 鐨勫伐浣滃師鐞?/span>

棣栧厛 memcached 鏄互瀹堟姢紼嬪簭鏂瑰紡榪愯浜庝竴涓垨澶氫釜鏈嶅姟鍣ㄤ腑錛岄殢鏃舵帴鍙楀鎴風鐨勮繛鎺ユ搷浣滐紝瀹㈡埛绔彲浠ョ敱鍚勭璇█緙栧啓錛岀洰鍓嶅凡鐭ョ殑瀹㈡埛绔?API 鍖呮嫭 Perl/PHP/Python/Ruby/Java/C#/C 絳夌瓑銆侾HP 絳夊鎴風鍦ㄤ笌 memcached 鏈嶅姟寤虹珛榪炴帴涔嬪悗錛屾帴涓嬫潵鐨勪簨鎯呭氨鏄瓨鍙栧璞′簡錛屾瘡涓瀛樺彇鐨勫璞¢兘鏈変竴涓敮涓鐨勬爣璇嗙 key錛屽瓨鍙栨搷浣滃潎閫氳繃榪欎釜 key 榪涜錛屼繚瀛樺埌 memcached 涓殑瀵硅薄瀹為檯涓婃槸鏀劇疆鍐呭瓨涓殑錛屽茍涓嶆槸淇濆瓨鍦?cache 鏂囦歡涓殑錛岃繖涔熸槸涓轟粈涔?memcached 鑳藉濡傛楂樻晥蹇熺殑鍘熷洜銆傛敞鎰忥紝榪欎簺瀵硅薄騫朵笉鏄寔涔呯殑錛屾湇鍔″仠姝箣鍚庯紝閲岃竟鐨勬暟鎹氨浼氫涪澶便?/span>

.2  memcached 瀹夎

棣栧厛鏄笅杞?memcached 浜嗭紝鐩墠鏈鏂扮増鏈槸 1.1.12錛岀洿鎺ヤ粠瀹樻柟緗戠珯鍗沖彲涓嬭澆鍒?memcached-1.1.12.tar.gz銆傞櫎姝や箣澶栵紝memcached 鐢ㄥ埌浜?libevent錛屾垜涓嬭澆鐨勬槸 libevent-1.1a.tar.gz

鎺ヤ笅鏉ユ槸鍒嗗埆灝?libevent-1.1a.tar.gz 鍜?memcached-1.1.12.tar.gz 瑙e紑鍖呫佺紪璇戙佸畨瑁咃細

# tar -xzf libevent-1.1a.tar.gz 
# cd libevent-1.1a 
# ./configure --prefix=/usr 
# make 
# make install 
# cd .. 
# tar -xzf memcached-1.1.12.tar.gz 
# cd memcached-1.1.12 
# ./configure --prefix=/usr 
# make 
# make install
瀹夎瀹屾垚涔嬪悗錛宮emcached 搴旇鍦?/usr/bin/memcached銆?/span>

3.濡備綍浣跨敤memcached-Server绔?

鍦ㄦ湇鍔$榪愯錛?/span>

# ./memcached -d -m 2048 -l 10.0.0.40 -p 11211  -u httpd
-d 浠ュ畧鎶ょ▼搴忥紙daemon錛夋柟寮忚繍琛?memcached錛?/span>
-m 璁劇疆 memcached 鍙互浣跨敤鐨勫唴瀛樺ぇ灝忥紝鍗曚綅涓?M錛?/span>

-l 璁劇疆鐩戝惉鐨?IP&nb

sp;鍦板潃錛屽鏋滄槸鏈満鐨勮瘽錛岄氬父鍙互涓嶈緗鍙傛暟錛?/span>
-p 璁劇疆鐩戝惉鐨勭鍙o紝榛樿涓?11211錛屾墍浠ヤ篃鍙互涓嶈緗鍙傛暟錛?/span>
-u 鎸囧畾鐢ㄦ埛錛屽鏋滃綋鍓嶄負 root 鐨勮瘽錛岄渶瑕佷嬌鐢ㄦ鍙傛暟鎸囧畾鐢ㄦ埛銆?/span>

榪欏皢浼氬惎鍔ㄤ竴涓崰鐢?G鍐呭瓨鐨勮繘紼嬶紝騫舵墦寮11211绔彛鐢ㄤ簬鎺ユ敹璇鋒眰銆傜敱浜?2浣嶇郴緇熷彧鑳藉鐞?G鍐呭瓨鐨勫鍧錛屾墍浠ュ湪澶т簬4G鍐呭瓨浣跨敤PAE鐨?2浣嶆湇鍔″櫒涓婂彲浠ヨ繍琛?-3涓繘紼嬶紝騫跺湪涓嶅悓绔彛榪涜鐩戝惉銆?/span>

4. 濡備綍浣跨敤memcached-Client绔?

鍦ㄥ簲鐢ㄧ鍖呭惈涓涓敤浜庢弿榪癈lient鐨凜lass鍚庯紝灝卞彲浠ョ洿鎺ヤ嬌鐢紝闈炲父綆鍗曘?/span>

PHP Example:
$options["debug"] = false;

$memc = new MemCachedClient($options);

$myarr = array("one","two", 3);

$memc->set("key_one", $myarr);
$options["servers"] = array("192.168.1.41:11211", "192.168.1.42:11212");

$val = $memc->get("key_one");

print $val[0]."\n"; // prints 'one‘

print $val[1]."\n"; // prints 'two‘

print $val[2]."\n"; // prints 3
5.涓轟粈涔堜笉浣跨敤鏁版嵁搴撳仛榪欎簺錛?/span>

鏆備笖涓嶈冭檻浣跨敤浠涔堟牱鐨勬暟鎹簱(MS-SQL, Oracle, Postgres, MysQL-InnoDB, etc..), 瀹炵幇浜嬪姟(ACID錛孉tomicity, Consistency, Isolation, and Durability )闇瑕佸ぇ閲忓紑閿錛岀壒鍒綋浣跨敤鍒扮‖鐩樼殑鏃跺欙紝榪欏氨鎰忓懗鐫鏌ヨ鍙兘浼氶樆濉炪傚綋浣跨敤涓嶅寘鍚簨鍔$殑鏁版嵁搴擄紙渚嬪Mysql-MyISAM錛夛紝涓婇潰鐨勫紑閿涓嶅瓨鍦紝浣嗚綰跨▼鍙堝彲鑳戒細琚啓綰跨▼闃誨銆侻emcached浠庝笉闃誨錛岄熷害闈炲父蹇?/span>

6.涓轟粈涔堜笉浣跨敤鍏變韓鍐呭瓨?

鏈鍒濈殑緙撳瓨鍋氭硶鏄湪綰跨▼鍐呭瀵硅薄榪涜緙撳瓨錛屼絾榪欐牱榪涚▼闂村氨鏃犳硶鍏變韓緙撳瓨錛屽懡涓巼闈炲父浣庯紝瀵艱嚧緙撳瓨鏁堢巼鏋佷綆銆傚悗鏉ュ嚭鐜頒簡鍏變韓鍐呭瓨鐨勭紦瀛橈紝澶氫釜榪涚▼鎴栬呯嚎紼嬪叡浜悓涓鍧楃紦瀛橈紝浣嗘瘯绔熻繕鏄彧鑳藉眬闄愬湪涓鍙版満鍣ㄤ笂錛屽鍙版満鍣ㄥ仛鐩稿悓鐨勭紦瀛樺悓鏍鋒槸涓縐嶈祫婧愮殑嫻垂錛岃屼笖鍛戒腑鐜囦篃姣旇緝浣庛?/span>

Memcached Server鍜孋lients鍏卞悓宸ヤ綔錛屽疄鐜拌法鏈嶅姟鍣ㄥ垎甯冨紡鐨勫叏灞鐨勭紦瀛樸傚茍涓斿彲浠ヤ笌Web Server鍏卞悓宸ヤ綔錛學eb Server瀵笴PU瑕佹眰楂橈紝瀵瑰唴瀛樿姹備綆錛孧emcached Server瀵笴PU瑕佹眰浣庯紝瀵瑰唴瀛樿姹傞珮錛屾墍浠ュ彲浠ユ惌閰嶄嬌鐢ㄣ?/span>

7.Mysql 4.x鐨勭紦瀛樻庝箞鏍?

Mysql鏌ヨ緙撳瓨涓嶆槸寰堢悊鎯籌紝鍥犱負浠ヤ笅鍑犵偣錛?/span>

褰撴寚瀹氱殑琛ㄥ彂鐢熸洿鏂板悗錛屾煡璇㈢紦瀛樹細琚竻絀恒傚湪涓涓ぇ璐熻澆鐨勭郴緇熶笂榪欐牱鐨勪簨鎯呭彂鐢熺殑闈炲父棰戠箒錛屽鑷存煡璇㈢紦瀛樻晥鐜囬潪甯鎬綆錛屾湁鐨勬儏鍐典笅鐢氳嚦榪樹笉濡備笉寮錛屽洜涓哄畠瀵筩ache鐨勭鐞嗚繕鏄細鏈夊紑閿銆?/span>

鍦?2浣嶆満鍣ㄤ笂錛孧ysql瀵瑰唴瀛樼殑鎿嶄綔榪樻槸琚檺鍒跺湪4G浠ュ唴錛屼絾memcached鍙互鍒嗗竷寮錛屽唴瀛樿妯$悊璁轟笂涓嶅彈闄愬埗銆?/span>

Mysql涓婄殑鏄煡璇㈢紦瀛橈紝鑰屼笉鏄璞$紦瀛橈紝濡傛灉鍦ㄦ煡璇㈠悗榪橀渶瑕佸ぇ閲忓叾瀹冩搷浣滐紝鏌ヨ緙撳瓨灝卞府涓嶄笂蹇欎簡銆?/span>

濡傛灉瑕佺紦瀛樼殑鏁版嵁涓嶅ぇ錛屽茍涓旀煡璇㈢殑涓嶆槸闈炲父棰戠箒錛岃繖鏍風殑鎯呭喌涓嬪彲浠ョ敤Mysql 鏌ヨ緙撳瓨錛屼笉鐒剁殑璇漨emcached鏇村ソ銆?/span>

8.鏁版嵁搴撳悓姝ユ庝箞鏍鳳紵

榪欓噷鐨勬暟鎹簱鍚屾鏄寚鐨勭被浼糓ysql Master-Slave妯″紡鐨勯潬鏃ュ織鍚屾瀹炵幇鏁版嵁搴撳悓姝ョ殑鏈哄埗銆?/span>

浣犲彲浠ュ垎甯冭鎿嶄綔錛屼絾鏃犳硶鍒嗗竷鍐欐搷浣滐紝浣嗗啓鎿嶄綔鐨勫悓姝ラ渶瑕佹秷鑰楀ぇ閲忕殑璧勬簮錛岃屼笖榪欎釜寮閿鏄殢鐫slave鏈嶅姟鍣ㄧ殑澧為暱鑰屼笉鏂闀跨殑銆?/span>

涓嬩竴姝ユ槸瑕佸鏁版嵁搴撹繘琛屾按騫沖垏鍒嗭紝浠庤岃涓嶅悓鐨勬暟鎹垎甯冨埌涓嶅悓鐨勬暟鎹簱鏈嶅姟鍣ㄧ粍涓婏紝浠庤屽疄鐜板垎甯冪殑璇誨啓錛岃繖闇瑕佸湪搴旂敤涓疄鐜版牴鎹笉鍚岀殑鏁版嵁榪炴帴涓嶅悓鐨勬暟鎹簱銆?/span>

褰撹繖涓妯″紡宸ヤ綔鍚庯紙鎴戜滑涔熸帹鑽愯繖鏍峰仛錛夛紝鏇村鐨勬暟鎹簱瀵艱嚧鏇村鐨勮浜哄ご鐤肩殑紜歡閿欒銆?/span>

Memcached鍙互鏈夋晥鐨勯檷浣庡鏁版嵁搴撶殑璁塊棶錛岃鏁版嵁搴撶敤涓昏鐨勭簿鍔涙潵鍋氫笉棰戠箒鐨勫啓鎿嶄綔錛岃岃繖鏄暟鎹簱鑷繁鎺у埗鐨勶紝寰堝皯浼氳嚜宸遍樆濉?鑷繁銆?/span>

9.Memcached蹇悧錛?/span>

闈炲父蹇紝瀹冧嬌鐢╨ibevent錛屽彲浠ュ簲浠樹換鎰忔暟閲忔墦寮鐨勮繛鎺ワ紙浣跨敤epoll錛岃岄潪poll錛夛紝浣跨敤闈為樆濉炵綉緇淚O錛屽垎甯冨紡鏁e垪瀵硅薄鍒頒笉鍚岀殑鏈嶅姟鍣紝鏌ヨ澶嶆潅搴︽槸O(1)銆?/span>

10.memcached鐨勭浉鍏蟲娊璞$被

public abstract class BaseManager<T extends BaseObject> implements Manager<T> 
 
     private MemcachedClient memcached; 
 
     protected int default_cache_time_second = 3600;  
 
      public void setMemcached(MemcachedClient memcached) 
 
         this.memcached = memcached; 
 
      } 
 
      public MemcachedClient getMemcached() 
 
         return memcached; 
 
     } 
 
      public void setDefault_cache_time_second(int default_cache_time_second) 
 
         this.default_cache_time_second = default_cache_time_second; 
 
    } public Object getCacheValueFromMemcached(String key) {

        return getCacheValueFromMemcached(key, null);

    }

    public Object getCacheValueFromMemcached(String key, Object obj) {

        Object new_obj = null;

        try {

            new_obj = memcached.get(key);

            } catch (Exception e) {

            if (logger.isWarnEnabled()) {

logger.warn("Failed to get from MeMCache", e); 
 
             } 
 
         } 
 
         return (new_obj != null) ? new_obj : obj; 
       } 
 
       public void setCacheValueToMemcached(String cacheKey, int time_to_live, Serializable obj) 
 
          if (null != memcached.get(cacheKey)) 
 
             memcached.replace(cacheKey, time_to_live, obj); 
 
          } else 
 
             memcached.add(cacheKey, time_to_live, obj); 
 
         } 
 
       }  
     }
11.service璋冪敤memcache鐨勪竴涓緥瀛愶細

public List<Integer> getLastModifyAlbumMember(int limit) {

        String cacheKey = this.createCachekey(new

       Object[]{"schedule","lastmodifyalbumember",limit});

        List list = (List) this.getCacheValueFromMemcached(cacheKey);

        List<Integer> list1 = new ArrayList<Integer>();

        if(null!=list&&list.size()>0){

            for (Object aList : list) {

                list1.add(Integer.parseInt(String.valueOf(aList)));

            }

        }

        return list1;

    }
鍙傝冭祫鏂欙細

http://www.danga.com/

http://www.linuxjournal.com/article/7451



Chan Chen 2012-04-19 17:36 鍙戣〃璇勮
]]>
主站蜘蛛池模板: 亚洲A∨无码一区二区三区| 亚洲精品网站在线观看不卡无广告| 亚洲AV日韩AV永久无码下载| 中文字幕久无码免费久久| 久久精品国产亚洲一区二区三区| 久久国产乱子精品免费女| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 日韩在线播放全免费| 91天堂素人精品系列全集亚洲| 最新国产乱人伦偷精品免费网站| 国产亚洲一区二区三区在线观看| 亚洲高清视频在线| 女人张开腿给人桶免费视频| 亚洲高清无码专区视频| 一级毛片完整版免费播放一区| 8888四色奇米在线观看免费看| 亚洲视频一区在线| 在线a级毛片免费视频| 亚洲精品无码人妻无码| 一区二区免费视频| 亚洲经典在线观看| 久久精品无码一区二区三区免费| 亚洲精品无码久久久久牙蜜区| 又大又粗又爽a级毛片免费看| 波霸在线精品视频免费观看| 亚洲午夜精品一区二区| 免费可以在线看A∨网站| 美女视频黄.免费网址| 国产亚洲一区二区精品| 免费A级毛片无码无遮挡内射| 亚洲AV性色在线观看| 免费在线观看h片| 亚洲精品动漫免费二区| 国内一级一级毛片a免费| 日韩毛片免费一二三| 亚洲AV无码一区二区乱孑伦AS| 中文字幕在线免费看| 亚洲国产日韩在线一区| 亚洲精品色婷婷在线影院| 久久久久久AV无码免费网站| 亚洲精华国产精华精华液好用 |