'memcached'에 해당되는 글 4건
- 2015.11.09 :: SpringMVC+Memcached(4)
- 2015.11.09 :: springmvc+memcacehd(3)
- 2015.11.09 :: SpringMVC + memcached maven 및 bean 설정 (2)
- 2015.11.06 :: SpringMVC + memcached(1)
3번과 dto는 동일하다.
하지만 bean은 변경이 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <aop:aspectj-autoproxy /> <!-- 이부분은 아마도 버그인듯 문서에는 없었는데 안쓰면 에러가 난다. --> <import resource="simplesm-context.xml" /> <bean name="defaultMemcachedClient" class="com.google.code.ssm.CacheFactory"> <property name="cacheClientFactory"> <bean name="cacheClientFactory" class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl" /> </property> <property name="addressProvider"> <bean class="com.google.code.ssm.config.DefaultAddressProvider"> <property name="address" value="192.168.0.105:11211" /> </bean> </property> <property name="configuration"> <bean class="com.google.code.ssm.providers.CacheConfiguration"> <property name="consistentHashing" value="true" /> </bean> </property> </bean> <bean class="com.google.code.ssm.Settings"> <property name="order" value="500" /> </bean> | cs |
service는 다음과 같이 설정하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @Override @CacheEvict(value="cachable") public boolean delete( long idx) { userDao.delete(idx); return false; } @Override @CachePut(value="cachable", key="#userDTO.idx") public UserDTO write( UserDTO userDTO) { return userDao.save(userDTO); } @Override @Cacheable(value="cachable", key="#idx") public UserDTO read( long idx) { UserDTO userDTO = userDao.findOne(idx); // userDao.save(userDTO); return userDTO; } | cs |
기존 ehcached와 동일하다. number 계열도 된다.
아마도 난 이 방법으로 사용할 듯 보인다.
소스 주소는 https://github.com/zest133/Memcached.git 여기로..
먼저 dto 설정.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | @Entity @Table(name="user") //중요!!!!!!!!!!!!!!!!!! memcached 할때!!!! public class UserDTO implements Serializable{ @Id private long idx; @Column(unique=true,nullable=false) private String id; @Column(nullable=false) private String pwd; private String email; @Column(nullable=false) private String name; public UserDTO(){ } public UserDTO(long idx, String id, String pwd, String email, String name){ this.idx = idx; this.id = id; this.pwd = pwd; this.email = email; this.name = name; } public long getIdx() { return idx; } public void setIdx(long idx) { this.idx = idx; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getName() { return name; } public void setName(String name) { this.name = name; } } | cs |
기본적인 user table로서 jpa 관련 annotation 으로 셋팅. 중요한 점은 memcached는 Serializable를 해야한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ..... 생략......... @Override @InvalidateSingleCache(namespace = "CacheKeyMethod") public boolean delete(@ParameterValueKeyProvider long idx) { userDao.delete(idx); return false; } @Override @UpdateSingleCache(namespace = "CacheKeyMethod", expiration = 3600) public UserDTO edit( @ParameterValueKeyProvider @ParameterDataUpdateContent UserDTO userDTO) { return userDao.save(userDTO); } @Override @ReadThroughSingleCache(namespace = "CacheKeyMethod", expiration = 3600) public UserDTO read(@ParameterValueKeyProvider long idx) { UserDTO userDTO = userDao.findOne(idx); // userDao.save(userDTO); return userDTO; } ..... 생략......... | cs |
1 2 3 4 5 6 | @CacheKeyMethod public String getId() { return id; } | cs |
사용 환경은 다음과 같다.
springMVC 3.2, hsqldb, jpa, hibernate, xmemcached-provider, spymemcached-provider ,com.google.code.simple-spring-memcached 이렇게 메이븐에 defendancy를 추가한다.
먼저 @UpdateSingleCache 이런 식으로 사용하는 방법을 먼저 설명한다. maven 설정 자체는 두 가지 방식다 동일하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.1.0.RELEASE</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.3.8.Final</version> </dependency> <dependency> <groupId>com.google.code.simple-spring-memcached</groupId> <artifactId>xmemcached-provider</artifactId> <version>3.6.0</version> </dependency> <dependency> <groupId>com.google.code.simple-spring-memcached</groupId> <artifactId>spymemcached-provider</artifactId> <version>3.6.0</version> </dependency> <dependency> <groupId> com.google.code.simple-spring-memcached </groupId> <artifactId>spring-cache</artifactId> <version>3.6.0</version> </dependency> | cs |
bean 등록은 다음과 같이 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <!-- spring data jpa 설정 --> <!-- jpa repository가 위치한 패키지 경로 등록 --> <jpa:repositories base-package="com.zest.memcached.user.dao" entity-manager-factory-ref="entityManagerFactory" /> <!-- 하이버네이트의 SessionFactory 에 상응하는 jpa의 EntityManagerFactory 등록 --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> </property> <property name="dataSource" ref="dataSource" /> <property name="jpaProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> <!-- Hsql 형식에 맞게 변환해주는 클래스 --> <prop key="hibernate.connection.pool_size">1</prop> <prop key="hibernate.connection.shutdown">true</prop> <!-- hsql에 있는 마지막 연결이 끊어지면 데이터베이스 shutdown 하는 플래그 --> <prop key="hibernate.show_sql">true</prop> <!-- SQL 출력 --> <prop key="hibernate.hbm2ddl.auto">create</prop> <!-- 테이블 자동 생성 --> </props> </property> <!-- 엔티티 정의된 클래스들이 있는 패키지 등록 --> <property name="packagesToScan" value="com.zest.memcached.user.dto" /> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory"></property> </bean> <!-- spring data jpa 설정 끝 --> | cs |
위 설명은 jpa 설정 부분이다.
xmemcached 설정은 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <aop:aspectj-autoproxy /> <!-- aop 관련 설정 --> <import resource="simplesm-context.xml" /> <bean name="defaultMemcachedClient" class="com.google.code.ssm.CacheFactory"> <property name="cacheClientFactory"> <bean name="cacheClientFactory" class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl" /> </property> <property name="addressProvider"> <bean class="com.google.code.ssm.config.DefaultAddressProvider"> <property name="address" value="192.168.0.105:11211" /> </bean> </property> <property name="configuration"> <bean class="com.google.code.ssm.providers.CacheConfiguration"> <property name="consistentHashing" value="true" /> </bean> </property> </bean> <bean class="com.google.code.ssm.Settings"> <property name="order" value="500" /> </bean> | cs |
코드 부분은 다음에............
멤 캐쉬는 글로벌 캐쉬로 아마도 redis(아직 공부중) 보다 사용이 쉽다. Spring에선 ehcache를 지원하지만 local 캐쉬인 관계로
정리 할려고 한다.
출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26740267
memcached는 위의 그림으로 설명이 된다. 머 그 이상 이하도 없다.
redis와 다른점을 말하자면, redis는 nosql 메모리 db로 in-memory 기반 으로 사용 될 수도 있고, 캐쉬로 사용 될 수 있으며, 이를 다시 clustering을 사용 할 수 있다.
여튼 memcached는 사용이 간단하므로, 널리 쓰인다. 설치는 위 그림 출처에 가보면 사용이 가능하다.
memcached 명령어는 http://smallmir.tistory.com/173 참조 하면 된다.
memcached는 많은 언어를 지원하며, java도 그중에 하나이다. 스프링에서는 xmemcached 라이브러리와 spymemcached 라이브러리 두개가 존재한다.
아무거나 써도 상관없을듯.....
사용법은 두가지로 나뉘는 듯 보이는데 @UpdateSingleCache 이런 annotation을 쓰는 방법과 기존 ehcache 와 동일한 방법 두가지로 나뉜다.