2016-04-12 4 views
1

Hallo allerseits Ich möchte Cache-Map in Java implementieren, in denen Map-Einträge nach der angegebenen Zeit ablaufen.Wie Implementieren von CacheMap mit automatischem Ablauf der Einträge?

Ich habe Schnittstelle wie diese, ich muss diese Methoden implementieren, aber ich verstehe nicht, wie eigentlich starten.

public class CacheMapImpl implements CacheMap<Integer, String> { 

    @Override 
    public void setTimeToLive(long timeToLive) { 


    } 

    @Override 
    public long getTimeToLive() { 

     return 0; 
    } 

    @Override 
    public String put(Integer key, String value) { 

     return null; 
    } 

    @Override 
    public void clearExpired() { 


    } 

    @Override 
    public void clear() { 


    } 

    @Override 
    public boolean containsKey(Object key) { 

     return false; 
    } 

    @Override 
    public boolean containsValue(Object value) { 

     return false; 
    } 

    @Override 
    public String get(Object key) { 

     return null; 
    } 

    @Override 
    public boolean isEmpty() { 

     return false; 
    } 

    @Override 
    public String remove(Object key) { 

     return null; 
    } 

    @Override 
    public int size() { 

     return 0; 
    } 

} 

Bitte sagen Sie mir, wie diese Methoden zu implementieren, wie ich anfangen soll für mich wenig Code schreiben, freundlich meine cachemap Schnittstelle mit dem Code aktualisieren.

+0

Ich würde vorschlagen, Sie verwenden die Guava-Bibliothek zum Caching. Oder ist es eine strikte Anforderung, eine für sich selbst zu implementieren? Wie hier: https://github.com/google/guava/wiki/CachesErklärt –

Antwort

2

Sie müssen eine interne Karte mit demselben Schlüssel verwalten. Verwenden Sie Ihre Put-Methode, um der Karte den neuen Wert hinzuzufügen, und fügen Sie außerdem einen Wert für Ihre interne Zeitübersicht hinzu. Sie können ein Long als Wert speichern, bei dem es sich um den konkreten Zeitpunkt für diesen Wert handelt.

Dann starten Sie einen neuen Thread im Hintergrund thatc überprüft alle Zeiten für alle Schlüssel in der internen Karte und entfernen Sie diejenigen, die 'alte' Einträge von beiden, interne Karte und Ihre Hauptkarte sind.

Hier ist der Code. Wie ich sehe, implementiert Ihre Karte eine Schnittstelle mit einigen Methoden, die zum Löschen der abgelaufenen Werte bereitgestellt werden. Ich verstehe, dass Sie keine automatische Methode zum Entfernen abgelaufener Werte benötigen. So sollte der Code etwas wie sein:

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 

public class CacheMapImpl implements CacheMap<Integer, String> { 

    private Map<Integer, Long> timesCache = new HashMap<Integer, Long>(); 
    private Map<Integer, String> values = new HashMap<Integer, String>(); 

    /** Time for the elemens to keep alive in the map in milliseconds. */ 
    long timeToLive = 0; 

    @Override 
    public void setTimeToLive(long timeToLive) { 
     this.timeToLive = timeToLive; 
    } 

    @Override 
    public long getTimeToLive() { 

     return this.timeToLive; 
    } 

    @Override 
    public String put(Integer key, String value) { 
     values.put(key, value); 
     timesCache.put(key, System.currentTimeMillis()); 
     return value; 
    } 

    @Override 
    public void clearExpired() { 

     // Just remove if timeToLive has been set before... 
     if (timeToLive > 0) { 
      List<Integer> keysToClear = new ArrayList<Integer>(); 
      long currentTime = System.currentTimeMillis(); 

      // Check what keys to remove 
      for (Entry<Integer, Long> e : timesCache.entrySet()) { 
       if ((currentTime - e.getValue().longValue()) > this.timeToLive) { 
        keysToClear.add(e.getKey()); 
       } 
      } 

      // Remove the expired keys 
      for (Integer key : keysToClear) { 
       this.timesCache.remove(key); 
       this.values.remove(key); 
      } 
     } 

    } 

    @Override 
    public void clear() { 
     this.timesCache.clear(); 
     this.values.clear(); 
    } 

    @Override 
    public boolean containsKey(Object key) { 

     return this.values.containsKey(key); 
    } 

    @Override 
    public boolean containsValue(Object value) { 

     return this.values.containsValue(value); 
    } 

    @Override 
    public String get(Object key) { 

     return this.values.get(key); 
    } 

    @Override 
    public boolean isEmpty() { 

     return this.values.isEmpty(); 
    } 

    @Override 
    public String remove(Object key) { 
     String rto = null; 
     if (containsKey(key)) { 
      this.values.remove(key); 
      this.timesCache.remove(key); 
      rto = key.toString(); 
     } 
     return rto; 
    } 

    @Override 
    public int size() { 

     return this.values.size(); 
    } 

} 
+0

können Sie mir Hilfe mit etwas Code zur Verfügung stellen, damit ich richtig verstehen kann? – Ahmad

+0

Ich werde bald hinzufügen, wie ich kann – Jorge

+0

danke ich warte – Ahmad

Verwandte Themen