개발관련/MongoDB 2015. 11. 17. 10:50

1
2
3
4
5
6
7
8
9
10
11
12
13
use test
db.crudtest.insert(
    {
        "idx" : 1,
        "name" : "aaa",
        "id" : "aaa",
        "type" : {
            "test1" :"test1",
            "test2" :"test2"
        }
        
    }
);
cs


몽고 db는 내부에 js로 동작(?)하는 듯한 느낌이다. 


먼저 rdb 처럼 어떤 db를 사용할지를 선택한다.  rdb처럼 먼저 스키마를 생성하고 이런짓은 안하고 없으면 만들고 있으면 그냥 가져다 쓴다. 머 여타 nosql도 마찬가지지만. 


use test를 하면 (여기서 ; 세미콜론을 붙으면 안되더라구요 =_=;) db라는 객체에 저장이 되는듯하다. 

이후 db.(콜렉션이름).insert 후 저장할 값을 json형태로 저장하면 된다. 


콜렉션은 document 기반의 table을 뜻한다. 머 elasticsearch나 solr, lucene등 document기반이다. 


insert형식은 자유롭다. object 를 기본으로 하며, 각 키값(field) : value 여기서 value는 다시 object또는 array가 올수 있다. 


1
2
3
4
5
6
7
8
9
db.crudtest.insert(
    {
        "idx" : 3,
        "name" : "gno",
        "id" : "gno"
        
    }
)    
 
cs



다음은 update문이다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//update
db.crudtest.update(
    //where
    {
        "name" :"ryu"
    },
    
    {
        //set 
        $set:{"name":"gun-ho"}
        ,
        //add
        $set: {
            "language": ["java","js","angular"]
        },
        //field delete
        $unset : {
            "id" : 1
        }
    }
)
 
cs

update는 크게 두개의 object가 존재하며, 첫번째는 where절을 뜻한다. 두번째는 rdb로 보면 set의 개념을 저장한다. 
만약 필드의 값을 바꾸고 싶고 또는 추가 하고 싶다면  $set을 하면된다. 또, 특정 필드를 삭제하고 싶다면 $unset을 하면 된다. RDB와는 다르게 모든 Field(column)이 동일하지 않아도 된다. 

또, 위에 예제를 보면 language라는 필드에 array 값을 추가 하였다. 이때 값을 또 추가 싶다면 그때는 $push라는 명령어를 쓰면된다. 느낌이 jquery또는 js 내장 함수와 매우 흡사하다. 여러개의 값을 push해서 하고 싶다면 $eash라는 명령어를 사용하면 된다. 
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
db.crudtest.update(
    
        {
        "name" :"gun-ho"
        },
        {
        $push : {
                "language" : "c++"
            }       
        }
    
);
    
 
db.crudtest.update(
    
        {
        "name" :"gun-ho"
        },
        {
        $push : {
                "language" : {
                    $each : ["c","python"]
                }
            }       
        }
    
);
 
cs

삭제는 다음과 같이 하면된다. 
1
2
 
db.crudtest.remove() 
cs

다음에는 find에 대해 알아보겠다. 


posted by 제스트
:
개발관련/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 제스트
: