Memcached 노트 - (2) Xmemcached & Spring 통합

오늘 은 Memcached 의 자바 클 라 이언 트 를 연구 하고 Xmemcached 1.3.5 를 사용 하여 간단 한 테스트 를 하고 Spring 과 어떻게 통합 하 는 지 소개 합 니 다.
관련 링크: Memcached 노트 - (1) 설치 & 일반적인 오류 & Memcached 노트 모니터링 - (2) Xmemcached & Spring 통합 Memcached 노트 - (3) Memcached 사용 총화 Memcached 노트 - (4) 높 은 병발 공격 에 대응
1. Memcached 클 라 이언 트 개요
Memcached Client 는 현재 3 가지 가 있 습 니 다.
  • Memcached Client for Java
  • SpyMemcached
  • XMemcached

  • 이 세 가지 클 라 이언 트 는 줄곧 각종 논쟁 이 존재 해 왔 다.
  • Memcached Client for Java 는 SpyMemcached 보다 안정 적 이 고 빠 르 며 광범 위 합 니 다.
  • SpyMemcached 는 Memcached Client for Java 보다 효율 적 입 니 다.
  • Xmemcached 는 Spy Memcache 보다 병발 효과 가 좋다.

  • 데이터 로 말 하고 공식 성능 대 비 를 참고 합 니 다.
    Memcached Client for Java: https://github.com/gwhalin/Memcached-Java-Client/wiki/PERFORMANCE
    XMemcached: http://xmemcached.googlecode.com/svn/trunk/benchmark/benchmark.html
    2. Xmemcached 특성
    Xmemcached 특성:
  • 고성능
  • 완전한 memcached 텍스트 프로 토 콜, 바 이 너 리 프로 토 콜 을 지원 합 니 다.
  • JMX 를 지원 하 며 MBean 을 통 해 성능 파라미터 조정, 서버 동적 추가 / 제거, 통계 보기 등 을 할 수 있다.
  • 클 라 이언 트 통계 지원
  • memcached 노드 의 동적 증 가 를 지원 합 니 다.
  • memcached 분포 지원: 나머지 분포 와 일치 성 해시 분포.
  • 더 많은 성능 조정 옵션.

  • 이 밖 에 Xmemcached 는 Spring 과 통합 되 기 쉽다.그리고 중국 오리지널! 
    3. Xmemcached 간단 한 실현
    MemcachedClient Builder 는 MemcachedClient 의 핵심 인터페이스 로 Client 의 구축 (build () 방법) 과 닫 기 (shutdown () 방법 을 제어 합 니 다.
    Xmemcached Client Builder 는 일반적으로 주소 목록 을 구조 적 으로 설정 합 니 다. 보통 가중치 도 설정 해 야 합 니 다. 코드 는 다음 과 같 습 니 다.
    public XMemcachedClientBuilder(List<InetSocketAddress> addressList) {
    		if (addressList != null) {
    			for (InetSocketAddress addr : addressList) {
    				this.addressMap.put(addr, null);
    			}
    		}
    	}
    
    	public XMemcachedClientBuilder(List<InetSocketAddress> addressList,
    			int[] weights) {
    		if (addressList != null) {
    			for (InetSocketAddress addr : addressList) {
    				this.addressMap.put(addr, null);
    			}
    		}
    		this.weights = weights;
    	}

    하지만 이 친구 가 this () 를 사용 하면 코드 를 아 낄 수 있 고 주석 도 달 아 주세요!
    연결 풀 크기 를 설정 하고 바 이 너 리 프로 토 콜 / 텍스트 프로 토 콜 등 을 사용 해 야 합 니 다.
    build () 방법 으로 획득
    MemcachedClient
    그리고 Memcached 를 통 해 set, get, replace, delete 등 Memcached 작업 을 할 수 있 습 니 다!
    상위 코드:
    import static junit.framework.Assert.*;
    
    import java.io.IOException;
    import java.util.concurrent.TimeoutException;
    
    import net.rubyeye.xmemcached.MemcachedClient;
    import net.rubyeye.xmemcached.MemcachedClientBuilder;
    import net.rubyeye.xmemcached.XMemcachedClientBuilder;
    import net.rubyeye.xmemcached.command.BinaryCommandFactory;
    import net.rubyeye.xmemcached.exception.MemcachedException;
    import net.rubyeye.xmemcached.utils.AddrUtil;
    
    import org.junit.Test;
    
    public class MemcachedClientTest {
    	@Test
    	public void test() {
    		MemcachedClientBuilder builder = new XMemcachedClientBuilder(
    				AddrUtil.getAddresses("10.11.155.26:11211 10.11.155.41:11211 10.10.76.31:11211 10.10.76.35:11211"),
    				new int[] { 1, 1, 1, 1 });
    		
    		//        ,      
    		builder.setConnectionPoolSize(50);
    
    		//     
    		builder.setFailureMode(true);
    
    		//        
    		builder.setCommandFactory(new BinaryCommandFactory());
    
    		MemcachedClient memcachedClient = null;
    		try {
    			memcachedClient = builder.build();
    			try {
    				//   /  
    				memcachedClient.set("zlex", 36000, "set/get");
    				assertEquals("set/get", memcachedClient.get("zlex"));
    
    				//   
    				memcachedClient.replace("zlex", 36000, "replace");
    				assertEquals("replace", memcachedClient.get("zlex"));
    
    				//   
    				memcachedClient.delete("zlex");
    				assertNull(memcachedClient.get("zlex"));
    			} catch (TimeoutException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (MemcachedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} finally {
    			if (memcachedClient != null) {
    				try {
    					memcachedClient.shutdown();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    }

    4. Xmemcached 와 Spring 통합
    Xmemcached 와 Spring 통합 참고 가능http://code.google.com/p/xmemcached/wiki/Spring_Integration, 여 기 는 가장 자주 사용 하 는 방법 만 말 합 니 다.
    memcached. properties 기본 설정:
    #           
    memcached.connectionPoolSize=50
    memcached.failureMode=true
    #server1
    memcached.server1.host=10.11.155.26
    memcached.server1.port=11211
    memcached.server1.weight=4
    #server2
    memcached.server2.host=10.11.155.41
    memcached.server2.port=11211
    memcached.server2.weight=3				
    #server3
    memcached.server3.host=10.10.76.31
    memcached.server3.port=11211
    memcached.server3.weight=2					
    #server4
    memcached.server4.host=10.10.76.35
    memcached.server4.port=11211
    memcached.server4.weight=1

    XML 프로필:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans
    	xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:p="http://www.springframework.org/schema/p"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    	<!-- http://code.google.com/p/xmemcached/wiki/Spring_Integration -->
    	<context:property-placeholder location="memcached.properties" />
    	<bean
    		id="memcachedClientBuilder"
    		class="net.rubyeye.xmemcached.XMemcachedClientBuilder"
    		p:connectionPoolSize="${memcached.connectionPoolSize}"
    		p:failureMode="${memcached.failureMode}">
    		<!-- XMemcachedClientBuilder have two arguments.First is server list,and 
    			second is weights array. -->
    		<constructor-arg>
    			<list>
    				<bean class="java.net.InetSocketAddress">
    					<constructor-arg>
    						<value>${memcached.server1.host}</value>
    					</constructor-arg>
    					<constructor-arg>
    						<value>${memcached.server1.port}</value>
    					</constructor-arg>
    				</bean>
    				<bean class="java.net.InetSocketAddress">
    					<constructor-arg>
    						<value>${memcached.server2.host}</value>
    					</constructor-arg>
    					<constructor-arg>
    						<value>${memcached.server2.port}</value>
    					</constructor-arg>
    				</bean>
    				<bean class="java.net.InetSocketAddress">
    					<constructor-arg>
    						<value>${memcached.server3.host}</value>
    					</constructor-arg>
    					<constructor-arg>
    						<value>${memcached.server3.port}</value>
    					</constructor-arg>
    				</bean>
    				<bean class="java.net.InetSocketAddress">
    					<constructor-arg>
    						<value>${memcached.server4.host}</value>
    					</constructor-arg>
    					<constructor-arg>
    						<value>${memcached.server4.port}</value>
    					</constructor-arg>
    				</bean>
    			</list>
    		</constructor-arg>
    		<constructor-arg>
    			<list>
    				<value>${memcached.server1.weight}</value>
    				<value>${memcached.server2.weight}</value>
    				<value>${memcached.server3.weight}</value>
    				<value>${memcached.server4.weight}</value>
    			</list>
    		</constructor-arg>
    		<property name="commandFactory">
    			<bean class="net.rubyeye.xmemcached.command.TextCommandFactory" />
    		</property>
    		<property name="sessionLocator">
    			<bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator" />
    		</property>
    		<property name="transcoder">
    			<bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
    		</property>
    	</bean>
    	<!-- Use factory bean to build memcached client -->
    	<bean
    		id="memcachedClient"
    		factory-bean="memcachedClientBuilder"
    		factory-method="build"
    		destroy-method="shutdown" />
    </beans>

    여기
    memcachedClient Builder 노드 완료
    Memcached Client Builder, 그리고 통과
    memcachedClient 노드 설정
    factory - method, 호출
    MemcachedClient Builder 의 build () 방법 생 성
    MemcachedClient, 설정
    destroy - method 를 닫 습 니 다.
    그러나 나 는 여전히 이곳 의 이상 을 누가 처리 해 야 할 지 의문 이다.Spring 용기 요?아니면 다른 대리 빈 이 포장 해 주 실 래 요?
    Spring 용기 지원 이 있 습 니 다. 코드 에 설정 할 필요 도 없고 build () 와 shutdown () 방법 을 중복 호출 할 필요 도 없습니다. 이 작업 은 Spring 에 맡 길 수 있 습 니 다.
    코드 는 다음 과 같 습 니 다:
    import static junit.framework.Assert.*;
    
    import java.util.concurrent.TimeoutException;
    
    import net.rubyeye.xmemcached.MemcachedClient;
    import net.rubyeye.xmemcached.exception.MemcachedException;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MemcachedSpringTest {
    
    	private ApplicationContext app;
    	private MemcachedClient memcachedClient;
    
    	@Before
    	public void init() {
    		app = new ClassPathXmlApplicationContext("applicationContext.xml");
    		memcachedClient = (MemcachedClient) app.getBean("memcachedClient");
    	}
    
    	@Test
    	public void test() {
    		try {
    			//   /  
    			memcachedClient.set("zlex", 36000, "set/get");
    			assertEquals("set/get", memcachedClient.get("zlex"));
    
    			//   
    			memcachedClient.replace("zlex", 36000, "replace");
    			assertEquals("replace", memcachedClient.get("zlex"));
    
    			//   
    			memcachedClient.delete("zlex");
    			assertNull(memcachedClient.get("zlex"));
    		} catch (TimeoutException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (MemcachedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }

    관련 링크: Memcached 노트 - (1) 설치 & 일반적인 오류 & Memcached 노트 모니터링 - (2) Xmemcached & Spring 통합 Memcached 노트 - (3) Memcached 사용 총화 Memcached 노트 - (4) 높 은 병발 공격 에 대응
    XMemcached User Guide

    좋은 웹페이지 즐겨찾기