Par exemple, Redis vous permet de spécifier une date d'expiration pour une entrée. C'est généralement suffisant, mais recherchez une bibliothèque de collections en Java capable de le faire.
pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>11</java.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.0-jre</version>
</dependency>
</dependencies>
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.apache.commons.collections4.map.PassiveExpiringMap;
public class App {
public static void main(String[] args) throws InterruptedException {
Map<String, String> map = new PassiveExpiringMap<String, String>(3000, TimeUnit.MILLISECONDS);
map.put("key1", "value1");
while (true) {
TimeUnit.MILLISECONDS.sleep(1000);
System.out.println(map.size());
}
}
}
Lorsque ce qui précède est exécuté, cela devient comme suit.
1
1
0
Date d'expiration 3 secondes. L'expiration n'est pas vérifiée à moins que vous n'effectuiez une opération spécifique sur la carte en tant que Passive ''
. Qu'est-ce qu'une opération spécifique? ```Toutes les entrées expirées sont supprimées de .. comme indiqué dans https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/PassiveExpiringMap.html Celui qui a quelque chose comme. ''.
note that passiveexpiringmap is not synchronized and is not thread-safe
Il est écrit que vous devez y faire attention.
import java.util.concurrent.TimeUnit;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
public class GuavaCaamain {
public static void main(String[] args) throws InterruptedException {
Cache<String, String> cache = CacheBuilder.newBuilder().expireAfterWrite(3000, TimeUnit.MILLISECONDS).build();
cache.put("key1", "value1");
while (true) {
TimeUnit.MILLISECONDS.sleep(1000);
cache.put("key2", "value2");
System.out.println(cache.size());
}
}
}
Lorsque ce qui précède est exécuté, cela devient comme suit.
2
2
1
Vérifiez la date d'expiration au moment de l'écriture, comme indiqué dans expireAfterWrite </ code>. Donc, si vous supprimez la ligne put du code ci-dessus, le contenu du cache ne changera pas.
Au contraire, pour vérifier au moment de la lecture, suivez les étapes ci-dessous.
Cache<String, String> cache = CacheBuilder.newBuilder().expireAfterAccess(3000, TimeUnit.MILLISECONDS).build();
https://stackoverflow.com/questions/3802370/java-time-based-map-cache-with-expiring-keys
Recommended Posts