일반적으로 application은 값비싼 계산 결과나 data를 조회하는 것이 data-source를 더 느리게 하는 경우 (ex. Database or webservice) cache data로 저장한다. 만약 그러한 데이터가 도시명이나 제품 형태와 같이 변경할 수 없다면 (혹은 대부분 변경할 수 없는 경우) 그러한 형태로 저장하는 경우는 의미가 있다. 하지만, 데이터가 주기적으로 재생성되거나 다시 조회해야 할 필요가 있다면 expiration time (유효기간)을 설정하는 것을 고려해볼 만하다. 이런 cache entry들을 mortal (생명주기를 갖는 데이터)이라고 한다. Infinispan에서는 2가지 형태로 entry expiration time을 설정할 수 있다.
- 데이터가 cache에 저장된 이후 유효 기간 (ex. lifespan)
- 데이터의 최종 접근 시간 (last accessed time)이후 유효 기간 (ex. Maximum idle time)
Cache Interface는 특별히 하나 혹은 두가지 expiration properties들을 적용할 수 있도록 put() method의 overloaded version을 제공한다. 다음 예제는 5초간의 유효기간을 갖는 entry를 어떻게 저장하는 지를 보여준다.
cache.put(location, weather, 5, TimeUnit.SECONDS);
이것을 유념하면서
application을 다시 실행시켜 보자.
git checkout -f step-3
mvn clean package exec:exec
[Output]
---- Fetching weather
information ----
Rome, Italy - Temperature: 12.9° C, Conditions: light rain
Como, Italy - Temperature: 6.3° C, Conditions: Sky is Clear
Basel, Switzerland - Temperature: 0.8° C, Conditions: overcast
clouds
Bern, Switzerland - Temperature: -1.6° C, Conditions: broken
clouds
London, UK - Temperature: 1.8° C, Conditions: light rain
Newcastle, UK - Temperature: 2.6° C, Conditions: scattered
clouds
Bucharest, Romania - Temperature: 9.3° C, Conditions: scattered
clouds
Cluj-Napoca, Romania - Temperature: 6.4° C, Conditions: scattered
clouds
Ottawa, Canada - Temperature: -7.0° C, Conditions: overcast
clouds
Toronto, Canada - Temperature: -7.0° C, Conditions: broken clouds
Lisbon, Portugal - Temperature: 14.6° C, Conditions: overcast
clouds
Porto, Portugal - Temperature: 12.2° C, Conditions: moderate rain
Raleigh, USA - Temperature: 3.9° C, Conditions: Sky is Clear
Washington, USA - Temperature: 3.4° C, Conditions: light rain
---- Fetched in 1205ms ----
---- Fetching weather information ----
Rome, Italy - Temperature: 12.9° C, Conditions: light rain
Como, Italy - Temperature: 6.3° C, Conditions: Sky is Clear
Basel, Switzerland - Temperature: 0.8° C, Conditions: overcast
clouds
Bern, Switzerland - Temperature: -1.6° C, Conditions: broken
clouds
London, UK - Temperature: 1.8° C, Conditions: light rain
Newcastle, UK - Temperature: 2.6° C, Conditions: scattered clouds
Bucharest, Romania - Temperature: 9.3° C, Conditions: scattered
clouds
Cluj-Napoca, Romania - Temperature: 6.4° C, Conditions: scattered
clouds
Ottawa, Canada - Temperature: -7.0° C, Conditions: overcast
clouds
Toronto, Canada - Temperature: -7.0° C, Conditions: broken clouds
Lisbon, Portugal - Temperature: 14.6° C, Conditions: overcast
clouds
Porto, Portugal - Temperature: 12.2° C, Conditions: moderate rain
Raleigh, USA - Temperature: 3.9° C, Conditions: Sky is Clear
Washington, USA - Temperature: 3.4° C, Conditions: light rain
---- Fetched in 2ms ----
---- Fetching weather information ----
Rome, Italy - Temperature: 12.9° C, Conditions: light rain
Como, Italy - Temperature: 6.3° C, Conditions: Sky is Clear
Basel, Switzerland - Temperature: 0.8° C, Conditions: overcast
clouds
Bern, Switzerland - Temperature: -1.6° C, Conditions: broken
clouds
London, UK - Temperature: 1.8° C, Conditions: light rain
Newcastle, UK - Temperature: 2.6° C, Conditions: scattered
clouds
Bucharest, Romania - Temperature: 9.3° C, Conditions: scattered
clouds
Cluj-Napoca, Romania - Temperature: 6.4° C, Conditions: scattered
clouds
Ottawa, Canada - Temperature: -7.0° C, Conditions: overcast clouds
Toronto, Canada - Temperature: -7.0° C, Conditions: broken clouds
Lisbon, Portugal - Temperature: 14.6° C, Conditions: overcast
clouds
Porto, Portugal - Temperature: 12.2° C, Conditions: moderate rain
Raleigh, USA - Temperature: 3.9° C, Conditions: Sky is Clear
Washington, USA - Temperature: 3.4° C, Conditions: light rain
---- Fetched in 1048ms ----
Expiration이 어떻게 동적하는지를 보여주기 위해서 우리는 5초간의 sleep time을 추가하고, 세번째로 각 도시의 날씨를 조회하여 출력해 보았다. 위에서 보는 것처럼 세번째 조회 작업 수행 시간은 거의 첫번째 경우 (uncached case)와 비슷하게 측정되는 것을 볼 수 있다 : 모든 entries들이 유효기간이 지났다. Infinispan에서 expiration은 느슨하게 확인한다. 예를 들어, 유효기간이 지난 entry를 조회하려고 시도할 경우, 그 시점에 해당 entry는 cache에서 삭제될 것이다. Eviction을 사용하여 pro-active removal (선제적으로 삭제)도 가능하다.
기본적으로 cache의 모든 entry에 대해서 expire되기를 원하는 경우에는 특별히 put() method 호출을 사용할 필요 없이 cache에 대한 설정으로 처리할 수 있다. 이것은 다음 단계에서 설명할 것이다.
댓글을 달아 주세요
댓글 RSS 주소 : http://www.yongbi.net/rss/comment/670