Mit Redis können Sie beispielsweise ein Ablaufdatum für einen Eintrag angeben. Das ist im Allgemeinen genug, aber suchen Sie nach einer Sammlungsbibliothek in Java, die das kann.
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());
        }
    }
}
Wenn das Obige ausgeführt wird, wird es wie folgt.
1
1
0
Ablaufdatum 3 Sekunden. Der Ablauf wird nur überprüft, wenn Sie eine bestimmte Operation auf der Karte als "Passiv" ausführen. Was ist eine bestimmte Operation?  `Alle abgelaufenen Einträge werden aus .. entfernt, wie in https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/PassiveExpiringMap.html gezeigt Der, der so etwas hat wie . `.
note that passiveexpiringmap is not synchronized and is not thread-safeEs steht geschrieben, dass Sie dort vorsichtig sein müssen.
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());
        }
    }
}
Wenn das Obige ausgeführt wird, wird es wie folgt.
2
2
1
Überprüfen Sie das Ablaufdatum zum Zeitpunkt des Schreibens, wie in  expireAfterWrite </ code> angegeben. Wenn Sie also die Put-Zeile aus dem obigen Code löschen, ändert sich der Inhalt des Caches nicht.
Um dies zum Zeitpunkt des Lesens zu überprüfen, führen Sie im Gegenteil die folgenden Schritte aus.
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