Jak odróżnić czas życia od czasu bezczynności w ehcache

103

Dokumentacja na ehache mówi:

timeToIdleSeconds: Sets the time to idle for an element before it expires.
i.e. The maximum amount of time between accesses before an element expires

timeToLiveSeconds: Sets the time to live for an element before it expires.
i.e. The maximum time between creation time and when an element expires.

Rozumiem timeToIdleSeconds

Ale czy to oznacza, że ​​po utworzeniu i pierwszym dostępie do elementu pamięci podręcznej timeToLiveSeconds nie ma już zastosowania?

Jacques René Mesrine
źródło

Odpowiedzi:

156

timeToIdleSecondsumożliwia przechowywanie obiektu w pamięci podręcznej, o ile jest żądany w okresach krótszych niż timeToIdleSeconds. timeToLiveSecondsspowoduje, że buforowany obiekt zostanie unieważniony po tych wielu sekundach, niezależnie od tego, ile razy lub kiedy był on żądany.

Powiedzmy to timeToIdleSeconds = 3. Następnie obiekt zostanie unieważniony, jeśli nie był żądany przez 4 sekundy.

Jeśli timeToLiveSeconds = 90, to obiekt zostanie usunięty z pamięci podręcznej po 90 sekundach, nawet jeśli zażądano go kilka milisekund w 90 sekundzie jego krótkiego życia.

Boris Pavlović
źródło
1
Zakładam więc, że zawsze chcemy ustawić czas bezczynności <ttl
Jacques René Mesrine
W powyższym komentarzu, gdy powiesz, że „Powiedzmy, że timeToIdleSeconds = 3. Obiekt zostanie unieważniony, jeśli nie został zażądany przez 4 sekundy.”, Kiedy powiesz unieważnij - co to znaczy? Czy usuwa to ze stosu? Jeśli obiekt zostanie usunięty z pamięci podręcznej, to nie wiem, do czego służy parametr timeToLive. Kiedy wykonaliśmy POC, widzimy, że dane są pobierane ze źródła po upływie timeoIdleseconds. Chociaż timoLive ma znacznie wyższą wartość, spodziewałbym się, że jest pobierany z pamięci podręcznej, ponieważ timelive ma znacznie większą wartość niż timeToIdle w naszym przypadku.
Gayathri,
3
@Gayathri Jeśli masz element danych, który jest często używany (co dwie sekundy), ale ma TTL wynoszący sześćdziesiąt sekund. Nadal byłby pobierany ze źródła raz na sześćdziesiąt sekund, nawet jeśli jest używany w sposób ciągły (nigdy bezczynności).
C. Ross
8
Jako uzupełnienie pierwszego komentarza (autorstwa @ JacquesRenéMesrine). W tym przypadku oba ustawione TTL i TTI (tj. Większe od zera): 1) TTI> = TTL: TTI nie ma wpływu . Zgłoszenie uważa się za wygasłe po creationTime + TTL2) TTI <TTL: Wejście uważa się za wygasłe pomin((max(lastAccessTime, creationTime) + TTI), (creationTime + TTL))
Timur Milovanov
„bez względu na to” -> „niezależnie”
Magnus,
41

Jeśli ustawisz oba, expirationTimebędzie Math.min(ttlExpiry, ttiExpiry), gdzie

ttlExpiry = creationTime + timeToLive
ttiExpiry = mostRecentTime + timeToIdle

Pełny kod źródłowy tutaj .

Lee Chee Kiam
źródło
1
Teraz to zachowanie ma dla mnie sens. Dziękuję za zwrócenie uwagi, szczególnie na tę Math.minczęść.
Prakash K
Ten kod czyni to bardziej przejrzystym niż ludzkie wyjaśnienie powyżej :-)
Maga Abdurakhmanov
22

Ze starej dokumentacji 1.1 (dostępnej w Google Cache, która jest łatwiejsza do przeglądania i zawiera więcej informacji niż obecne dokumenty AFAIK):

timeToIdleSeconds

To jest atrybut opcjonalny.

Dozwolone wartości to liczby całkowite od 0 do Integer.MAX_VALUE.

Jest to liczba sekund, przez które element powinien żyć od ostatniego użycia. Używane oznacza wstawione lub udostępnione.

0 ma specjalne znaczenie, które nie polega na sprawdzaniu elementu na czas bezczynności, tj. Będzie bezczynny na zawsze.

Wartość domyślna to 0.

timeToLiveSeconds

To jest atrybut opcjonalny.

Dozwolone wartości to liczby całkowite od 0 do Integer.MAX_VALUE.

Jest to liczba sekund, przez które element powinien żyć, odkąd został utworzony. Utworzone środki są wstawiane do pamięci podręcznej przy użyciu metody Cache.put.

0 ma specjalne znaczenie, które nie polega na sprawdzaniu czasu życia elementu, tj. Będzie żył wiecznie.

Wartość domyślna to 0.

Damo
źródło