본문 바로가기

대용량 플랫폼

[박혜웅] Memcached Benchmark for List Data Structure

memcached는 빠르고, 분산 처리 되고, 사용법도 간단하여 응용 분야가 매우 넓다.
기본적으로 Map<key, value> 형태로 모든 자료를 저장한다, 
value는 byte[] 형태의 모든 데이타를 저장할 수 있지만, value의 최대 크기는 1MB이다.
오픈소스라서 그런지 역시 홈페이지의 자료(memcached FAQ)가 제일 좋다. 

하지만, memcached를 실 서비스에 적용하다 보면 value에 단순한 int, double, char[], String 보다 List, Set, Map등의 자료 구조를 저장해야 할 경우가 많다.
자료구조가 List일 경우 어떤 방식으로 저장해야 set/get 의 속도나 호환성 면에서 가장 효과적인지, JAVA의 String, JAVA의 ArrayList<String>, JSON의 배열형태인 JSonArray로 테스트해 보자.

실행 환경
Memcached Server: memcached 1.4.5 
Memcached Server: memcached -d -u nobody -m 1024 -p 7941
Memcached Client: Memcached-Java-Client 2.5.2 
JSON Parser: JSON in JAVA 

String의 경우 아이템을 얻을 때, String.substring을 사용하기 위하여, 내부적으로 고정길이(10byte)를 한 아이템으로 저장했다.
JSONArray는 serializable하지 않기 때문에, String 을 이용하여 변환했다.

MemCachedListTest.java
<주의>소스의 LOOP나 ITEMS 값을 크게 할 경우, 
Windows 7 64bit 에서 블루스크린이 뜨는 경우가 있다. 정확한 원인은 모르겠으나 
Memcached-Java-Client 의 내부적인 문제로 보인다.

실행 결과
Memcached-Java-Client 가 JAVA의 Serialization 을 이용했다면,  [박혜웅] JAVA Serialize, Deserialize 벤치마크 와 결과가 같아야 한다.
하지만 Memcached-Java-Client 가 내부적으로 Serialization 을 구현하여, 결과는 String, ArrayList, JSONArray 모두 처리속도가 비슷하다. Memcached-Java-Client.setPrimitiveAsString() 를 바꾸어도 결과는 비슷하다.

-----------------------------------
items=100, primitiveAsString=false;
-----------------------------------
set String(100): 0.003700 secs
get String(100): 0.002300 secs

set ArrayList(100): 0.005000 secs
get ArrayList(100): 0.003700 secs

set JSONArray(100): 0.002400 secs
get JSONArray(100): 0.005200 secs

-----------------------------------
items=1000, primitiveAsString=false;
-----------------------------------
set String(1000): 0.003900 secs
get String(1000): 0.004800 secs

set ArrayList(1000): 0.011100 secs
get ArrayList(1000): 0.023200 secs

set JSONArray(1000): 0.007700 secs
get JSONArray(1000): 0.004200 secs

-----------------------------------
items=10000, primitiveAsString=false;
-----------------------------------
set String(10000): 0.012000 secs
get String(10000): 0.015300 secs

set ArrayList(10000): 0.011300 secs
get ArrayList(10000): 0.008600 secs

set JSONArray(10000): 0.014500 secs
get JSONArray(10000): 0.015000 secs

-----------------------------------
items=100, primitiveAsString=true;
-----------------------------------
set String(100): 0.002200 secs
get String(100): 0.002200 secs

set ArrayList(100): 0.002200 secs
get ArrayList(100): 0.002200 secs

set JSONArray(100): 0.003800 secs
get JSONArray(100): 0.002200 secs

-----------------------------------
items=1000, primitiveAsString=true;
-----------------------------------
set String(1000): 0.003400 secs
get String(1000): 0.003300 secs

set ArrayList(1000): 0.003400 secs
get ArrayList(1000): 0.002300 secs

set JSONArray(1000): 0.003300 secs
get JSONArray(1000): 0.003400 secs

-----------------------------------
items=10000, primitiveAsString=true;
-----------------------------------
set String(10000): 0.012700 secs
get String(10000): 0.012100 secs

set ArrayList(10000): 0.012900 secs
get ArrayList(10000): 0.008900 secs

set JSONArray(10000): 0.013800 secs
get JSONArray(10000): 0.014800 secs