개발관련/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에 대해 알아보겠다.
개발관련/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 여기로..
개발관련/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 |