'개발관련/memcached'에 해당되는 글 4건

  1. 2015.11.09 :: SpringMVC+Memcached(4)
  2. 2015.11.09 :: springmvc+memcacehd(3)
  3. 2015.11.09 :: SpringMVC + memcached maven 및 bean 설정 (2)
  4. 2015.11.06 :: SpringMVC + memcached(1)
개발관련/memcached 2015. 11. 9. 11:12

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 여기로.. 

posted by 제스트
:
개발관련/memcached 2015. 11. 9. 11:02

먼저 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



service부분은 위 코드와 같다. @InvalidateSingleCache, @UpdateSingleCache, @ReadThroughSingleCache를 쓰며, 
InvalidateSingleCache는 만료시 , @UpdateSingleCache 내용이나, 컨테츠가 update될때, @ReadThroughSingleCache 단순히 읽을때 사용한다. 
하지만 이방법에는 큰 문제가 있다. string만 가능하다는 점이다. 아직 number 계열을 케스팅 하는 방법을 못찾았다. 

read를 할때와 update할때 이때 memcached의 값이 다르다는 것을 발견할 것이다. 이러한 문제를 해결하기 위해 dto에 @CacheKeyMethod를 사용 하면 되지만 정착 number에 대한 key는 셋팅이 불가 하므로 사용하기는 쉽지 않았다. 

값을 확인 하는 방법은 

telent xxx.xxx.xxx.xxx 11211 

stats items 를 하면 memcached의 값이 나오며 키값을 모를 경우는 stats cachedump items의 key, 개수 형태로 쓰면된다. ex) stats cachedump 7 10


다음에는 ehcached와 동일한 annotation 기반을 설명 하고자 한다. 

1
2
3
4
5
6
 
@CacheKeyMethod
    public String getId() {
        return id;
    }
 
cs



posted by 제스트
:
개발관련/memcached 2015. 11. 9. 10:29

사용 환경은 다음과 같다. 

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

코드 부분은 다음에............ 


posted by 제스트
:
개발관련/memcached 2015. 11. 6. 17:08

멤 캐쉬는 글로벌 캐쉬로 아마도 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 와 동일한 방법 두가지로 나뉜다. 





posted by 제스트
: