2017-12-04 52 views
1

캐시에서 읽은 항목을 제거 (무효화)하고 싶습니다.읽기 후에 항목을 제거하도록 구아바 캐시를 구성하는 방법은 무엇입니까?

그래서 항목은 처음 읽을 때까지 캐시에 있어야합니다.

expireAfterAccess(0, TimeUnit.NANOSECONDS)을 추가하려고했지만 캐시가 채워지지 않았습니다.

그런 식으로 구아바 캐시를 사용할 방법이 있습니까? 아니면 읽은 후에 수동으로 항목을 무효화해야합니까? 내 예를 들어 넌스에서

+0

왜에 접속하여 즉시 무효화하려는 경우, 캐시를해야합니까? –

+0

@OleksandrBondarchuk 특정 기간 (예 : 15 분) 후에 만료되는 항목이 있어야하며 읽기 후에는 즉시 처리해야합니다. nonces를 저장하고 싶습니다. - https://en.wikipedia.org/wiki/Cryptographic_nonce – pixel

답변

3

이것은 작동하지 않습니다. "액세스"는 "읽기 또는 쓰기 액세스"를 의미하며 읽기 직후 만료되면 쓰기 직후 만료됩니다.

항목을 수동으로 제거 할 수 있습니다. 단일 액세스에서 그것을하기 위해 asMap()보기를 사용할 수 있습니다 : 당신은 구아바 캐시 종류의 고급이고 매우 유연 expireAfter(Expiry)을 제공 카페인으로 전환 할 수

String getAndClear(String key) { 
    String[] result = {null};  
    cache.asMap().compute(key, (k, v) -> 
     result[0] = v; 
     return null; 
    }); 
    return result[0]; 
} 

.

그러나 내가 원하는 것은 캐시에 대한 작업이라고 생각하지 않습니다. nonces가 결코 반복되어서는 안되기 때문에, 나는 저장할 이유가 없다고 생각합니다. 일반적으로 즉시 생성하여 사용합니다.

당신이 잘못했을 수 있으며 정교하게 작성하여 보안 문제를 피할 수 있습니다.

+0

안녕하세요, Google의 SafetyNet 구현에 nonces가있는 경우가 있습니다. 전화가 nonce를 요청한 다음 서버가 확인하는 JWT 토큰을 보냅니다. 그 순간 JWT 토큰에 이전에 요청 된 nonce가 있는지 확인해야합니다. 다음을 참조하십시오 : https://www.synopsys.com/blogs/software-security/wp-content/uploads/2015/10/3_safetynet_secure_750.png – pixel

+0

@pixel "세션에 대한 nonce를 저장하는 WebService가 있습니다." 어떤 짐을보십시오. 어쨌든, 나는 나의 대답을 업데이트했다. – maaartinus

+0

+1이 목적을 위해 '캐시'를 사용하지 마십시오. 당신이해야 할 일의 시작 부분에 nonce를 생성 한 다음, 끝나면 (범위를 벗어나 GCed되고) 만료되도록해야합니다. 만료일 15 분은 길거나 지연된 요청을하지 못하도록 방지하는 것입니다. 실제로는 만료일에 가까운 항목에 대해서는 그러한 논스톱을 유지하지 않아야합니다. – dimo414

0

두 번 생성됩니다

LoadingCache<String, String> cache = CacheBuilder.newBuilder().expireAfterAccess(0, TimeUnit.NANOSECONDS) 
    .build(new CacheLoader<String, String>() { 
     @Override 
     public String load(String key) throws Exception { 
      return createNonce(); 
     } 
    }); 

@Test 
public void test_cache_eviction() throws Exception { 
    String nonce1 = cache.getUnchecked("key"); 
    String nonce2 = cache.getUnchecked("key"); 
} 

public String createNonce() { 
    String createdNonce = "createdNonce"; 
    System.out.println(createdNonce); 
    return createdNonce; 
} 

로그에서 "createdNonce는"두 번 인쇄됩니다.

0

조작 GET 제거는지도 인터페이스에 remove 간단 :

Object cachedValue = cache.asMap().remove(key);