Closed cheesecrust closed 1 month ago
์ปค๋ฐ ๋ฉ์ธ์ง ์์ ํด์ฃผ์ธ์.
Upgrade to ehcache version => Upgrade ehcache version
@cheesecrust ehcache2 -> ehcache3 ์ ๊ทธ๋ ์ด๋ํ๋ฉด์ ์ ๊ฑฐ๋ ๊ธฐ๋ฅ๊ณผ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ ์ ๋ฆฌํด what i did ๋ถ๋ถ์ ๊ฐ์ ํด์ฃผ์ธ์.
@uhm0311 ์ ์ปค๋ฐ ํ์ ์ด TEST์ธ๊ฐ์? ์ ๋ฐ์ ์ผ๋ก ์์กด์ฑ๊ณผ ์ธํฐํ์ด์ค ์์ฒด๊ฐ ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด๊ณผ ๊ฐ์ด INTERNAL๋ก ๋์ด์ผํ ๊ฒ ๊ฐ์๋ฐ์.
@cheesecrust ehcache2 -> ehcache3 ์ ๊ทธ๋ ์ด๋ํ๋ฉด์ ์ ๊ฑฐ๋ ๊ธฐ๋ฅ๊ณผ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ ์ ๋ฆฌํด what i did ๋ถ๋ถ์ ๊ฐ์ ํด์ฃผ์ธ์.
์ถ๊ฐํ์์ต๋๋ค.
@cheesecrust
์ปค๋ฐ ๋ฉ์ธ์ง๋ ๋ค์ INTERNAL
๋ก ๋ณ๊ฒฝํด์ฃผ์ธ์.
@cheesecrust
ehcache3 ์ ๊ตฌํ์์๋ ๋ง๋ฃ์๊ฐ์ ์ฌ๋ ๋ณ์๋ฅผ ttl ๊ณผ tti ์ค์ ์ด ๊ณต์ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์ ์ค์ ํ๋ ์ค์ ์ผ๋ก ๋ฎ์ด์์์ง๊ณ ehcache2 ์ ๊ฒฝ์ฐ์๋ ๋๊ฐ์ค ํ๋์ ์กฐ๊ฑด๋ง ์ฑ๋ฆฝํ๋ฉด ๋ง๋ฃ์ํต๋๋ค.
์์ ๋ด์ฉ์ด ๋ชจํธํฉ๋๋ค.
TTL, TTI ์ค์ ์ ๊ดํ ehcache2 vs. ehcache3 ์ฐจ์ด์ ์ ์๊ณ ์ถ์ ๋ฐ์.
@jhpark816
TTL, TTI ์ค์ ์ ๊ดํ ehcache2 vs. ehcache3 ์ฐจ์ด์ ์ ์๊ณ ์ถ์ ๋ฐ์.
- ehcache manual์ ๊ธฐ์ ๋ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ฐจ์ด์ ์ด ์๋์?
- ํ ์คํธ๋ก ํ์ธํ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
- ๊ทธ ์ธ์ ๋ฐฉ๋ฒ์ผ๋ก ํ์ธํ ์ฐจ์ด์ ์ด ์๋์?
ํ ์คํธ๋ก ํ์ธํ ์ฐจ์ด์ ์ ๊ธฐ์ ํ๊ฒ ์ต๋๋ค.
CacheConfiguration config =
new CacheConfiguration(name, max)
.copyOnRead(copyOnRead)
.copyOnWrite(copyOnWrite)
.memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LRU)
.eternal(false)
.timeToLiveSeconds(exptime)
.timeToIdleSeconds(exptime)
.diskExpiryThreadIntervalSeconds(60)
.persistence(new PersistenceConfiguration().strategy(
PersistenceConfiguration.Strategy.NONE));
protected void setUp() throws Exception {
super.setUp();
ConnectionFactoryBuilder cfb = new ConnectionFactoryBuilder();
cfb.setFrontCacheExpireTime(5);
...
}
public void testGet() throws Exception {
for (String k : keys) {
client.set(k, 2, k + "_value").get();
}
String key = keys.get(0);
Future<Object> f = client.asyncGet(key);
Object result = f.get();
Object cached = client.getLocalCacheManager().get(key);
assertNotNull(result);
assertNotNull(cached);
assertSame("not the same result", result, cached);
// after 3 seconds : remote expired, locally cached
Thread.sleep(3000);
f = client.asyncGet(key);
result = f.get();
cached = client.getLocalCacheManager().get(key);
assertNotNull(result);
assertNotNull(cached);
assertEquals("not the same result", result, cached);
// after another 3 seconds : both remote and local expired
Thread.sleep(3000);
f = client.asyncGet(key);
result = f.get();
cached = client.getLocalCacheManager().get(key);
assertNull(result);
assertNull(cached);
}
์๋ ํ์ฌ develop
๋ธ๋์น์ LocalCahceManager ์ค์ ๊ณผ ํ
์คํธ ์ฝ๋ ์
๋๋ค. ํ
์คํธ ์ฝ๋๋ ์์ดํ
์ ์์ฑํ๊ณ 3์ด ํ์ ์์ฒญํ๋ฉด ๋ฐํ์ ์ฑ๊ณตํ๊ณ 3์ด๋ฅผ ๋ ๊ธฐ๋ค๋ฆฐ ํ์ ์์ฒญํ๋ฉด ์คํจํ๋ ํ
์คํธ ์ฝ๋ ์
๋๋ค. ๋ฐ๋ผ์ ์ ์ฒ๋ผ ์ค์ ์ ํ๋ฉด TTL ๋ง์ด ์ ์ฉ๋๋๊ฒ์ ์ ์ ์์ต๋๋ค. TTI ๋ฅผ ์ ์ฉํ๋ค๋ฉด ์ต์ด 3 ์ด๋ฅผ ๊ธฐ๋ค๋ฆฐ ํ์ ์์ฒญ ํ์์๋ ๋ง๋ฃ์๊ฐ์ด ์ด๊ธฐํ ๋์ด ๋ง์ง๋ง assertNull
์์ ์คํจํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ ๋ ์ค์ ์ ์์๋ฅผ ๋ฐ๊ฟ๋ ๊ฐ์ต๋๋ค. (์ฝ๋ ์์์ ttl ๋ค์์ tti ๋ฅผ ํ๊ฑฐ๋ tti ํ์ ttl ์ ์ค์ )
์ด์ ๋ฐ๋ผ ์ค์ ์์ .timeToLiveSeconds(exptime)
๋ฅผ ์ ๊ฑฐํ๋ค๋ฉด ํด๋น ํ
์คํธ ์ฝ๋๋ ์คํจ ํฉ๋๋ค. ๋ง์ง๋ง assertNull(result);
์์ ์คํจํฉ๋๋ค. TTI ๋ง์ด ์ค์ ๋์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ฐ๋ฉด ehcache3 ๋ก ๋์ด์ฌ๋ ์๋ ์ฒ๋ผ ๋ฌธ๋ฒ๋ง ๋ฐ๊พธ๊ฒ ๋๋ฉด TTI ๋ง์ด ์ค์ ๋์์ ๋์ ๊ฐ์ ๊ณณ์์ ์คํจ ํฉ๋๋ค.
.withExpiry(ExpiryPolicyBuilder
.timeToLiveExpiration(Duration.of(exptime, ChronoUnit.SECONDS)))
.withExpiry(ExpiryPolicyBuilder
.timeToIdleExpiration(Duration.of(exptime, ChronoUnit.SECONDS)));
ํ์ง๋ง ์ ์ฝ๋์์ ๋ ์ค์ ์ ์์๋ฅผ ๋ฐ๊พธ๋ฉด ํ
์คํธ ์ฝ๋๋ฅผ ์์ ํ์ง ์์๋ ์ฑ๊ณตํฉ๋๋ค. (TTL, TTI -> TTI, TTL) ๊ทธ ์ด์ ๋ ehcache3 ์์๋ ๋ง๋ฃ ์๊ฐ์ ์ธก์ ํ ๋ create
, access
, update
๋ผ๋ ๋ด๋ถ ์ธ์๋ฅผ ํ์ฉํ๋๋ฐ TTL ๊ณผ TTI ๋ชจ๋ ๊ฐ์ ๊ณณ์ ์์ ํ๊ธฐ ๋๋ฌธ์ ๋์ค์ ์ค์ ํ ์ ์ฑ
์ด ์ ์ฉ๋ฉ๋๋ค.
๋ฐ๋ผ์ ehcahe2 ์์๋ TTL ๊ณผ TTI ๋ฅผ ๋ชจ๋ ์ ์ฉํ๊ฒ ๋๋ฉด ์์์ ์๊ด์์ด ํญ์ TTL ์ด ์ ์ฉ๋๊ณ ehcache3 ์์๋ TTL ๊ณผ TTI ๋ฅผ ์ ์ฉํ ๋ ๋ง์ง๋ง์ ์ ์ฉํ ์ ์ฑ ์ด ์ ์ฉ๋ฉ๋๋ค.
์๋ ํํ๋ก ์ค์ ์ด ๊ฐ๋ฅํ๋์?
.withExpiry(ExpiryPolicyBuilder
.timeToLiveExpiration(Duration.of(exptime, ChronoUnit.SECONDS))
.timeToIdleExpiration(Duration.of(exptime, ChronoUnit.SECONDS)));
@cheesecrust ๊ทธ๋ฆฌ๊ณ , ehcache2์ ehcache3์ manual ์ค๋ช ์ ํ์ธํ๊ณ ์๋ ค์ฃผ์ธ์.
@jhpark816
์๋ ํํ๋ก ์ค์ ์ด ๊ฐ๋ฅํ๋์?
.withExpiry(ExpiryPolicyBuilder .timeToLiveExpiration(Duration.of(exptime, ChronoUnit.SECONDS)) .timeToIdleExpiration(Duration.of(exptime, ChronoUnit.SECONDS)));
์์ ํํ๋ก๋ ์ค์ ๋ถ๊ฐํฉ๋๋ค. ๋๊ฐ์ ์ค์ ์ ๋จ๊ธฐ๊ณ TTL ๋ง ์ค์ ํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ด ํด์ผํฉ๋๋ค.
.withExpiry(ExpiryPolicyBuilder
.timeToIdleExpiration(Duration.of(exptime, ChronoUnit.SECONDS)))
.withExpiry(ExpiryPolicyBuilder
.timeToLiveExpiration(Duration.of(exptime, ChronoUnit.SECONDS)));
ehcache2 manual ์์๋
<cache name="myCache"
maxEntriesLocalDisk="10000" eternal="false" timeToIdleSeconds="3600"
timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU">
</cache>
์์ ๊ฐ์ด ttl ๊ณผ tti ๋ฅผ ๋์์ ์ค์ ํ ๊ฒฝ์ฐ ๋ ์ค์ ํ๋์ ๋ง๋ฃ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ฉด ๋ง๋ฃ๋๋ค๊ณ ์๋ดํ๊ณ ์์ต๋๋ค.
ehcache3 doc ์์๋ ์์ ๊ฐ์ ์์๋ฅผ ์ ์ํ์ง ์๋๋ฐ, tti ๋ ehcache3 ๋ถํฐ ๋น๊ณต์์ ์ผ๋ก ๋ ์ด์ ์ง์ํ์ง ์๋ ๊ฐ๋ ์ด๋ผ๊ณ ํฉ๋๋ค. https://github.com/ehcache/ehcache3/issues/1097
TTL ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ด ์๋ดํ๊ณ ์์ต๋๋ค.
CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
ResourcePoolsBuilder.heap(100))
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(20)))
.build();
TTI ์ค์ ์ ์์ ์ ๊ฑฐํ๋๋ก ํ ๊น์?
@cheesecrust @oliviarla @brido4125 @uhm0311
withExpiry()
๋ฉ์๋๋ก Expiry ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ด๋ฉฐ, 2๋ฒ ๋์ค๋ฉด ๋ค์ ์ค์ ํ ๊ฐ์ด ๋ฎ์ด์ฐ๊ธฐ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.withExpiry()
๋ฉ์๋๋ก TTL or TTI ์ค์ ํ๋๋ฅผ ์ค์ ํ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.withExpiry()
๋ฉ์๋๋ก TTL๊ณผ TTI ๋ชจ๋๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ด ์์๊น์?
withExpiry()
๋ฉ์๋์ ํด๋น ํด๋์ค ์ฝ๋๋ฅผ ๋ณด๋ฉด ํ์ธ ๊ฐ๋ฅํ์ง ๊ถ๊ธํฉ๋๋ค. .withExpiry(ExpiryPolicyBuilder
.timeToIdleExpiration(Duration.of(exptime, ChronoUnit.SECONDS)))
.withExpiry(ExpiryPolicyBuilder
.timeToLiveExpiration(Duration.of(exptime, ChronoUnit.SECONDS)));
@jhpark816
.withExpiry()
๋ฉ์๋์ ๊ฒฝ์ฐ ExpiryPolicy()
๋ฅผ ์ง์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ExpiryPolicy()
๋ฅผ .timeToLiveExpiration()
, .timeToIdleExpiration()
์์ ๋ฐํํฉ๋๋ค. ๋ฐ๋ผ์ .withExpiry()
๋ฅผ ํ ๋ ๋ง๋ค ์๋ก์ด ์ ์ฑ
์ ์ง์ ํ๋๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ TTL ๊ณผ TTI ๋ชจ๋๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์๋๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
ExpiryPolicyBuilder ์ฝ๋๋ฅผ ๋ณด๋ฉด, TTL๊ณผ TTI๋ฅผ ๋ชจ๋ ์ค์ ํ ๋ฐฉ๋ฒ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐธ๊ณ ๋ฐ๋๋๋ค. https://github.com/tarantool/tarantool-jcache/blob/master/src/main/java/org/tarantool/jsr107/ExpiryPolicyBuilder.java
ARCUS์์๋ TTL๋ง ์ค์ ํ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๐ Related Issue
โจ๏ธ What I did
ehcache version 3 ๋ก ์ ๊ทธ๋ ์ด๋
cacheManger ๋ณ๊ฒฝ ehcache2 ์์๋ cacheManger ๋ฅผ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ ์ ์ฒด ์ดํ๋ฆฌ์ผ์ด์ ์์ ํ๋์ cacheManger ๋ง์ ์ฌ์ฉํฉ๋๋ค. ํ์ง๋ง, ehcache3 ์ ๊ฒฝ์ฐ์๋ ์ฌ๋ฌ cacheManger ๋ฅผ ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฒ ๋ฒ์ ์ ์์๋ ์ฝ๋ ์์ฒด์ ์ฑ๊ธํค ํจํด์ ์ ์ฉ์์ผ ๊ธฐ์กด๊ณผ ๋์ผํ๊ฒ cacheManger ๋ฅผ ์ดํ๋ฆฌ์ผ์ด์ ์์ ํ๋๋ง ๊ฐ์ง๋๋ก ํ์์ต๋๋ค.
Element ๊ฐ์ฒด์ ์ญ์ ehcahce2 ์ Element ๊ฐ์ฒด๊ฐ ehcache3 ์์๋ ์ญ์ ๋์์ต๋๋ค. ์ญ์ ๋ ํ์ Cache ์ ์ง์ ์ ์ฅํ๋ ํํ๋ก ๋ฐ๋์ด ์ด๋ฅผ ์์ ํ์์ต๋๋ค.
CacheConfiguration ๋ณ๊ฒฝ ๊ธฐ์กด ์ค์ ์ด ์ฌ๋ผ์ง๊ฑฐ๋ ๊ธฐ๋ณธ ๋ํดํธ ์ค์ ์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
.copyOnRead(copyOnRead), .copyOnWrite(copyOnWrite)
: ์ด ์ค์ ์ ์ฌ๋ผ์ง๊ณ ์๋ false ๋ก ์ค์ ์ ํ์๋๋ฐ ์ด๊ฒ์ด ๊ธฐ๋ณธ๋์์ด ๋์์ต๋๋ค.diskExpiryThreadIntervalSeconds
: ํด๋น ์ค์ ์ ์ฌ๋ผ์ก์ต๋๋ค.LRU policy
: ํด๋น ์ค์ ์ ๋ํดํธ ๊ฐ์ ๋๋ค. ์ด ์ธ ์ค์ ์ ์ธํฐํ์ด์ค๊ฐ ๋ฐ๋์ด ๊ทธ์ ๋ฐ๋ผ ์์ ํ์์ต๋๋ค.๊ธฐ์กด์ ehcahe2 ์์๋ cacheManger๊ฐ ํ๋๋ก ์ด๋ฅผ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํ์๋๋ฐ ์ด๋ฅผ ์์ฑ์ ๋ง๋ค ํ๋์ฉ ๊ฐ์ง๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
TTL ๋ง์ ์ค์ ํ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.