??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩一区二区三区观看,成人在线观看网址,国产精品视频永久免费播放http://www.aygfsteel.com/czihong/category/51442.htmlzh-cnTue, 30 Apr 2013 22:12:45 GMTTue, 30 Apr 2013 22:12:45 GMT60memcached 客户端代?Java memcached client学习(fn)http://www.aygfsteel.com/czihong/articles/398082.htmlChan ChenChan ChenFri, 19 Apr 2013 04:16:00 GMThttp://www.aygfsteel.com/czihong/articles/398082.htmlhttp://www.aygfsteel.com/czihong/comments/398082.htmlhttp://www.aygfsteel.com/czihong/articles/398082.html#Feedback0http://www.aygfsteel.com/czihong/comments/commentRss/398082.htmlhttp://www.aygfsteel.com/czihong/services/trackbacks/398082.htmlRefer to:http://makemyownlife.iteye.com/blog/1439581

java memcached client
源码Qȝ代码量还是很的 
主要是如下两个类: 
MemcachedClient.java 
SockIOPool.java

?先看推荐的测试代? 
Java代码  收藏代码
/** 
 * 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 );  
          //q是开启一个nagle 法。改法避免|络中充塞小包Q提高网l的利用?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 ) );  
        }  
  
}  
其实 对于我来?我很x(chng)白的是连接池是如何配|的,关键在于 pool.initialize(); q个Ҏ(gu)如何初始化的?nbsp;

Java代码  收藏代码
/**  
     * 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();  
        }  
    }  
如上代码程如下Q?nbsp;
1  (g)是否已l被初始?nbsp;
2  定义可用链接 Q繁忙链接池 
3  判断是否一致性hash法 q是普通的法 
4  定义一个后台线E?Q来l护 
?Q首先来分析下一致性hash法?nbsp;

从如下代码来分析 Q?nbsp;
Java代码  收藏代码
  if (   
         this.hashingAlg == CONSISTENT_HASH )  
        populateConsistentBuckets();  
}

Java代码  收藏代码
/** serverdC致性hash??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];  
            }  
              
            //有兴的朋友可以参考^衡Hash 法的另一个指标是q?nbsp;(Balance) Q定义如下:(x)    q性 q性是指哈希的l果能够可能分布到所有的~冲中去Q这样可以得所有的~冲I间都得到利?nbsp; 
            
//?jin)解册U情况, consistent hashing 引入?#8220;虚拟节点”的概念,它可以如下定义:(x) “虚拟节点”Q?nbsp;virtual node Q是实际节点?nbsp;hash I间的复制品Q?nbsp;replica Q,一实际个节点对应了(jin)若干?#8220;虚拟节点”Q这个对应个C成ؓ(f)“复制个数”Q?#8220;虚拟节点”?nbsp;hash I间中以 hash 值排列?nbsp; 
            double factor = Math.floor(((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight);  
              
            for ( long j = 0; j < factor; j++ ) { //加密规则cM 127.0.0.1_1    
                byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() ); //转化?6位的字节数组  
                
//16位二q制数组?位ؓ(f)一l,每组W?个值左U?4位,W三个值左U?6位,W二个值左U?位,W一个gUM。进行或q算Q得C个小??2 ơ方的long?nbsp; 
                for ( int h = 0 ; h < 4; h++ ) { //因ؓ(f)?6?nbsp;  
                    Long k =  //实际上每个字节进行了(jin)q算  
                          ((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到连接池 q里慢慢?nbsp; 
                addSocketToPool( availPool, servers[i], socket );  
                if ( log.isDebugEnabled() )  
                    log.debug( "++++ created and added socket: " + socket.toString() + " for host " + servers[i] );  
            }  
        }  
          
    }  
?比如?我们调用?如下代码: 
Java代码  收藏代码
MemcachedClient mcc = new MemcachedClient();  
mcc.set("6", 1);  

q里key 如何定位C台server呢?我先把一致性hash法的定位方法说下?nbsp;
Java代码  收藏代码
//得到定位server的Socket装对象  
SockIOPool.SockIO sock = pool.getSock( key, hashCode );  

Java代码  收藏代码
//计算出key对应的hash?md5) Q然?nbsp; 
long bucket = getBucket( key, hashCode );  

Java代码  收藏代码 
//得到大于hash的mapQ因为treemap已经排好序了(jin)。调用tailMap可以得到大于{于q个hash的对?nbsp;Q然后调用firstKey得到圆环上的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.aygfsteel.com/czihong/articles/375295.htmlChan ChenChan ChenThu, 19 Apr 2012 09:36:00 GMThttp://www.aygfsteel.com/czihong/articles/375295.htmlhttp://www.aygfsteel.com/czihong/comments/375295.htmlhttp://www.aygfsteel.com/czihong/articles/375295.html#Feedback0http://www.aygfsteel.com/czihong/comments/commentRss/375295.htmlhttp://www.aygfsteel.com/czihong/services/trackbacks/375295.html
Memcached是danga.comQ运营LiveJournal的技术团队)(j)开发的一套分布式内存对象~存pȝQ用于在动态系l中减少数据库负载,提升性能。LJ每秒动态页面访问量几千ơ,用户700万。Memcached数据库负蝲大幅度降低,更好的分配资源,更快速访问?/span>

    关于q个东西Q相信很多h都用q,本文意在通过对memcached的实现及(qing)代码分析Q获得对q个?gu)的开源Y件更深入的了(jin)解,q可以根据我们的需要对其进行更q一步的优化。末?jin)将通过对BSM_Memcache扩展的分析,加深?memcached的用方式理解。?/span>

1.Memcached是什?/span>

在阐q这个问题(sh)前,我们首先要清楚它“不是什?#8221;。很多h把它当作和SharedMemory那种形式的存储蝲体来使用Q虽然memcached使用?jin)同L(fng)“Key=>Value”方式l织数据Q但是它和共享内存、APC{本地缓存有非常大的区别。Memcached是分布式的,也就是说它不是本地的。它Z|络q接Q当然它也可以用localhostQ方式完成服务,本n它是一个独立于应用的程序或守护q程QDaemon方式Q。即Memcached是高性能的,分布式的内存对象~存pȝQ用于在动态应用中减少数据库负载,提升讉K速度?/span>

Memcached 使用libevent库实现网l连接服务,理论上可以处理无限多的连接,但是它和Apache不同Q它更多的时候是面向E_的持l连接的Q所以它实际的ƈ发能力是有限制的。在保守情况下memcached的最大同时连接数?00Q这和LinuxU程能力有关p,q个数值是可以调整的。关?libevent可以参考相x(chng)档?Memcached内存?sh)用方式也和APC不同。APC是基于共享内存和MMAP的,memcachd有自q内存分配法和管理方式,它和׃n内存没有关系Q也没有׃n内存的限Ӟ通常情况下,每个memcachedq程可以理2GB的内存空_(d)如果需要更多的I间Q可以增加进E数?/span>

2. Memcached适合什么场?/span>

在很多时候,memcached都被滥用?jin),q当然少不了(jin)对它的抱怨。我l常在论坛上看见有h发脓(chung)Q类g“如何提高效率”Q回复是“用memcached”Q至于怎么用,用在哪里Q用来干什么一句没有。memcached不是万能的,它也不是适用在所有场合?/span>

Memcached ?#8220;分布?#8221;的内存对象缓存系l,那么是_(d)那些不需?#8220;分布”的,不需要共享的Q或者干脆规模小到只有一台服务器的应用, memcached不会(x)带来M好处Q相反还?sh)(x)拖慢系l效率,因ؓ(f)|络q接同样需要资源,即是UNIX本地q接也一栗在我之前的试数据中显C, memcached本地d速度要比直接PHP内存数组慢几十倍,而APC、共享内存方式都和直接数l差不多。可见,如果只是本地U缓存,使用 memcached是非怸划算的?/span>

 Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库了(jin)很多SQL解析、磁盘操作等开销Q而且它是使用内存来管理数据的Q所以它可以提供比直接读取数据库更好的性能Q在大型pȝ中,讉K同样的数据是很频J的Q?memcached可以大大降低数据库压力,使系l执行效率提升。另外,memcached也经怽为服务器之间数据׃n的储媒介Q例如在SSOpȝ中保存系l单点登陆状态的数据可以保存在memcached中,被多个应用共享?/span>

需要注意的是,memcached使用内存理数据Q所以它是易qQ当服务器重启,或者memcachedq程中止Q数据便?x)丢失,所?memcached不能用来持久保存数据。很多h的错误理解,memcached的性能非常好,好到?jin)内存和盘的对比程度,其实memcached使用内存q不?x)得到成百上千的d速度提高Q它的实际瓶颈在于网l连接,它和使用盘的数据库pȝ相比Q好处在于它本n非常“?#8221;Q因为没有过多的开销和直接的d方式Q它可以L应付非常大的数据交换量,所以经怼(x)出现两条千兆|络带宽都满负荷?jin),memcachedq程本nq不占用多少CPU资源的情c(din)?/span>

通常的网늼存方式有动态缓存和?rn)态缓存等几种Q在ASP.NET中已l可以实现对面局部进行缓存,而用memcached的缓存比 ASP.NET的局部缓存更加灵z,可以~存?sh)L的对象,不管是否在页面上输出。而memcached最大的优点是可以分布式的部|Ԍq对于大规模应用来说也是必不可少的要求?/span>

LiveJournal.com使用?jin)memcached在前端进行缓存,取得?jin)良好的效果Q而像wikipedia,sourceforge{也采用?jin)或卛_采用memcached作ؓ(f)~存工具。memcached可以大规模网站应用发挥巨大的作用?/span>

2.1 memcached 的工作原?/span>

首先 memcached 是以守护E序方式q行于一个或多个服务器中Q随时接受客L(fng)的连接操作,客户端可以由各种语言~写Q目前已知的客户?API 包括 Perl/PHP/Python/Ruby/Java/C#/C {等。PHP {客L(fng)在与 memcached 服务建立q接之后Q接下来的事情就是存取对象了(jin)Q每个被存取的对象都有一个唯一的标识符 keyQ存取操作均通过q个 key q行Q保存到 memcached 中的对象实际上是攄内存?sh)的Qƈ不是保存?cache 文g中的Q这也是Z?memcached 能够如此高效快速的原因。注意,q些对象q不是持久的Q服务停止之后,里边的数据就?x)丢失?/span>

.2  memcached 安装

首先是下?memcached ?jin),目前最新版本是 1.1.12Q直接从官方|站卛_下蝲?memcached-1.1.12.tar.gz。除此之外,memcached 用到?libeventQ我下蝲的是 libevent-1.1a.tar.gz

接下来是分别?libevent-1.1a.tar.gz ?memcached-1.1.12.tar.gz 解开包、编译、安装:(x)

# 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
安装完成之后Qmemcached 应该?/usr/bin/memcached?/span>

3.如何使用memcached-Server?

在服务端q行Q?/span>

# ./memcached -d -m 2048 -l 10.0.0.40 -p 11211  -u httpd
-d 以守护程序(daemonQ方式运?memcachedQ?/span>
-m 讄 memcached 可以使用的内存大,单位?MQ?/span>

-l 讄监听?IP&nb

sp;地址Q如果是本机的话Q通常可以不设|此参数Q?/span>
-p 讄监听的端口,默认?11211Q所以也可以不设|此参数Q?/span>
-u 指定用户Q如果当前ؓ(f) root 的话Q需要用此参数指定用户?/span>

q将?x)启动一个占?G内存的进E,q打开11211端口用于接收h。由?2位系l只能处?G内存的寻址Q所以在大于4G内存?sh)用PAE?2位服务器上可以运?-3个进E,q在不同端口q行监听?/span>

4. 如何使用memcached-Client?

在应用端包含一个用于描qClient的Class后,可以直接用,非常单?/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.Z么不使用数据库做q些Q?/span>

暂且不考虑使用什么样的数据库(MS-SQL, Oracle, Postgres, MysQL-InnoDB, etc..), 实现事务(ACIDQAtomicity, Consistency, Isolation, and Durability )需要大量开销Q特别当使用到硬盘的时候,q就意味着查询可能?x)阻塞。当使用不包含事务的数据库(例如Mysql-MyISAMQ,上面的开销不存在,但读U程又可能会(x)被写U程d。Memcached从不dQ速度非常快?/span>

6.Z么不使用׃n内存?

最初的~存做法是在U程内对对象q行~存Q但q样q程间就无法׃n~存Q命中率非常低,D~存效率极低。后来出C(jin)׃n内存的缓存,多个q程或者线E共享同一块缓存,但毕竟还是只能局限在一台机器上Q多台机器做相同的缓存同h一U资源的费Q而且命中率也比较低?/span>

Memcached Server和Clients共同工作Q实现跨服务器分布式的全局的缓存。ƈ且可以与Web Server共同工作QW(xu)eb Server对CPU要求高,对内存要求低QMemcached Server对CPU要求低,对内存要求高Q所以可以搭配用?/span>

7.Mysql 4.x的缓存怎么?

Mysql查询~存?sh)是很理惻I因ؓ(f)以下几点Q?/span>

当指定的表发生更新后Q查询缓存(sh)(x)被清I。在一个大负蝲的系l上q样的事情发生的非常频繁Q导致查询缓存效率非怽Q有的情况下甚至q(sh)如不开Q因为它对cache的管理还是会(x)有开销?/span>

?2位机器上QMysql对内存的操作q是被限制在4G以内Q但memcached可以分布开Q内存规模理Z不受限制?/span>

Mysql上的是查询缓存,而不是对象缓存,如果在查询后q需要大量其它操作,查询~存帮不上忙了(jin)?/span>

如果要缓存的数据不大Qƈ且查询的不是非常频繁Q这L(fng)情况下可以用Mysql 查询~存Q不然的话memcached更好?/span>

8.数据库同步怎么P

q里的数据库同步是指的类似Mysql Master-Slave模式的靠日志同步实现数据库同步的机制?/span>

你可以分布读操作Q但无法分布写操作,但写操作的同步需要消耗大量的资源Q而且q个开销是随着slave服务器的增长而不断增长的?/span>

下一步是要对数据库进行水q_分,从而让不同的数据分布到不同的数据库服务器组上,从而实现分布的dQ这需要在应用中实现根据不同的数据q接不同的数据库?/span>

当这一模式工作后(我们也推荐这样做Q,更多的数据库D更多的让人头疼的g错误?/span>

Memcached可以有效的降低对数据库的讉KQ让数据库用主要的精力来做不频繁的写操作Q而这是数据库自己控制的,很少?x)自己阻?自己?/span>

9.Memcached快吗Q?/span>

非常快,它用libeventQ可以应付(sh)Q意数量打开的连接(使用epollQ而非pollQ,使用非阻塞网lIOQ分布式散列对象C同的服务器,查询复杂度是O(1)?/span>

10.memcached的相x(chng)象类

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的一个例子:(x)

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;

    }
参考资料:(x)

http://www.danga.com/

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



Chan Chen 2012-04-19 17:36 发表评论
]]>
վ֩ģ壺 ľ| պ| | | | | Ϫ| | | | Ѩ| | ʮ| ̫| | | | ī| ʯ| Դ| | | ݰ| Ϫ| ͭ| | | | ղ| Ȫ| | | ״| ϲ| | | ԭ| ɽ| | | ˰|