7
votes

Java cache Hashmap expire quotidiennement

Je voudrais avoir un hashmap , qui chaque jour à minuit, le cache expirera.

Veuillez noter que c'est une solution J2EE afin que plusieurs threads puissent y accéder.

Quelle est la meilleure façon de la mettre en œuvre en Java?


0 commentaires

4 Réponses :


2
votes

java.util.timer code> et java.util.timertask code> peut s'avérer utile.

Créer un timerask code> qui peut effacer , ou recréer, le hashmap via un Minuterie code> instance est arrangé pour qu'il soit exécuté à minuit. p>

Par exemple: P>

// Public single shared hash map.
static Map<String, String> cached_map_ = new HashMap<String, String>();

public class Hash_map_resetter
    extends TimerTask
{
    // Constructor takes reference to containing
    // Timer so it can reset itself after execution.
    Hash_map_resetter(Timer a_timer) { timer_ = a_timer; }

    // Clear cache.
    public void run()
    {
        cached_map_ = new HashMap<String, String>();
        System.out.println("Cached cleared");
        timer_.schedule(new Hash_map_resetter(timer_), 100);
    }

    // Reference to containing Timer.
    private final Timer timer_;
}

// Example initiation.
Timer t = new Timer();
t.schedule(new Hash_map_resetter(t), 100);


2 commentaires

Où dois-je commencer la minuterie? Dans quelle classe?


@Odelya, la seule exigence est qu'il a accès au HashMap que vous souhaitez réinitialiser afin que vous puissiez simplement définir une classe imbriquée à l'intérieur de la classe contenant le hashmap et commencez la minuterie dans le constructeur de la classe extérieure.



4
votes

Vous voulez que chaque chose dans le hashmap soit rincé à minuit?

Si oui, je pense que je créerais un nouveau hashmap et la substituerait à l'original. Étant donné que la substitution est faite en une seule étape et que rien d'autre n'essaie de faire le même changement, je crois que cela devrait être le fil-sûr.

Tout ce qui est dans le milieu de l'accès sera autorisé à terminer son accès. Cela suppose que rien d'autre ne tient une référence à ce hashmap.

Si les références à la HASMAP ne sont pas consolidées à un seul endroit, je suppose que hashmap.clear () est votre meilleur pari si le hashmap est synchronisé.

Si le hashmap n'est pas synchronisé, vous ne pouvez la modifier que d'un seul fil, non? Avoir cet appel de fil hashmap.cpear () .

Je pense que cela couvre tous les cas.


2 commentaires

Oui, je veux que tout soit rincé à minuit. Pouvez-vous s'il vous plaît fournir des échantillons de code? Je ne l'ai pas compris de la réponse


Si votre hashmap est nommée "cache", le code pour effacer en toute sécurité serait "cache = nouveau hashmap ();"



3
votes

Vous pouvez également examiner à l'aide de GUAVA cachebuilder , qui vous permet de créer une instance personnalisée de leur cache interface. Parmi les autres fonctionnalités utiles, cachebuilder vous permet de définir une expiration chronométrée, etc. à vos propres extrémités.

edit: Je dois noter que vous définissez une expiration des entrées basées sur dernier accès ou Dernière écriture , Cette suggestion ne convient donc pas à ce que vous demandez exactement, ce qui est de rincer tout une fois par nuit. Vous pouvez toujours envisager de modifier votre conception si l'utilisation d'une API tiers est une option. Guava est une bibliothèque très intelligente IMHO et non seulement pour la mise en cache.


0 commentaires

7
votes

Bien que les autres suggestions puissent fonctionner pour le moment de l'expiration, il est important de noter que:

expiration du hashmap peut être fait paresseusement

I.e. sans fil de moniteur!

strong> Le moyen le plus simple de mettre en œuvre l'expiration est donc comme suit:

1) étendre la carte de hachage et créez un prochain (Longue) variable, initialisée au système.CurrentTime .... dans le constructeur. Ceci sera réglé égal à la prochaine période de minuit, en millisecondes ...

2) Ajoutez le snippet suivant à la première ligne du "contenant" et "obtenez" Méthodes (ou toute autre méthode charbonnée de veiller à ce que les données ne soient pas étalées) comme suit: xxx


4 commentaires

Dois-je toujours déclarer le hashmap comme celui-ci: mapper CampagneTOIMG = Collections.SynchronizedMap (nouveau hashmap ()); avec SyncrhonizedMap?


Merci! J'ai effectivement utilisé Joda pour la manipulation de l'heure: DateTime Date = Nouveau DateTime (). Todatemidnight (). TodateTime (); DateTime demain = date.plusdays (1); NextMidtime = demain.getmillis ();


Cool - content que cela a travaillé. La déclaration de carte synchronisée ne fera pas de mal ... Il va nettoyer votre code afin que vous n'ayez pas à vous soucier de la synchronisation sur place.


En ce qui concerne l'extension: je m'attendrais à ce que vous puissiez prolonger la méthode de la carte synchronisée.