Maison  >  Article  >  Java  >  Exemple de code de cache local Java

Exemple de code de cache local Java

Y2J
Y2Joriginal
2017-05-15 09:50:122352parcourir

Cet article présente principalement le code d'implémentation du cache local Java. L'éditeur pense qu'il est plutôt bon. Maintenant, je vais le partager avec vous et le donner comme référence. Suivons l'éditeur pour jeter un œil

Scénarios d'utilisation

Dans les Java applications, pour les données avec une fréquence d'accès élevée et peu de mises à jour, la solution habituelle est de ceci type de données est ajouté au cache. Par rapport à la lecture à partir de la base de données, l'efficacité du cache de lecture sera grandement améliorée.

Dans un environnement de cluster, les caches distribués couramment utilisés incluent Redis, Memcached, etc. Cependant, dans certains scénarios commerciaux, il peut ne pas être nécessaire de créer un système de mise en cache distribué complexe. Dans un environnement autonome, vous souhaitez généralement utiliser le cache interne (LocalCache).

Implémentation

Il existe deux implémentations de LocalCache , l'une est basée sur Con<a href="http://www.php%20.cn%20/wiki/1046.html" target="_blank">current<code> Con<a href="http://www.php.cn/wiki/1046.html" target="_blank">current</a><a href="http://www.php.cn/wiki/762.html" target="_blank">Hash</a><a href="http://www.php.cn/code/8210.html" target="_blank">Map</a> HashLinkedHashMap Map LRU implémente la mise en cache locale de base, et l'autre est basé sur

pour implémenter

Cache local des politiques.

Implémentation basée sur ConcurrentHashMap

static {
  timer = new Timer();
  map = new ConcurrentHashMap<>();
}

ConcurrentHashMap ConcurrentHashMap utilise comme structure de stockage de cache. Parce que le thread de est LocalCache sûr JDK1.8 , le fonctionnement de ConcurrentHashMap basé sur cette implémentation dans un environnement concurrent multithread est sûr. Dans ConcurrentHashMap , map prend en charge la lecture entièrement simultanée, ce qui améliore également l'efficacité du cache local. L'opération de cache est implémentée en appelant l'opération de

sur

. Private Constructor


privateLocalCache(){

}

LocalCache

est une classe utilitaire avec un constructeur privé Renforcer capacités non instanciables.

Mécanisme de suppression du cache


/**
 * 清除缓存任务类
 */
 static classCleanWorkerTaskextendsTimerTask{

   private String key;

   publicCleanWorkerTask(String key){
     this.key = key;
   }

   publicvoidrun(){
     LocalCache.remove(key);
   }
 }

CleanWorkerTask Le nettoyage des caches invalides est implémenté par la classe Timer. La classe interne TimerTask hérite de de l'utilisateur efface le cache. Chaque fois que

ajoute un nouvel élément

, timer.schedule sera appelé pour charger la tâche de vider le cache.

Implémentation basée sur LinkedHashMap

LinkedHashMap LinkedHashMap utilise LRU comme structure de stockage de cache. La stratégie

est principalement mise en œuvre via la fonctionnalité de séquence d'accès de

.

LRU

LRU Least Recently Used

est l'abréviation de

, ce qui signifie qu'il n'a pas été utilisé récemment. Le cache LRU utilisera cet algorithme pour éliminer les anciens éléments de données dans le cache afin d'optimiser l'espace mémoire.

Carte basée sur la stratégie LRU

LinkedHashMap LRU Ici, nous utilisons map pour mettre en œuvre LinkedHashMap en fonction de la stratégie map . Instanciez accessOrder en appelant le constructeur de la classe parent true . Définir le paramètre LRU sur

garantit qu'il peut mettre en œuvre la stratégie

.

static classLRUMap<K,V>extendsLinkedHashMap<K,V>{

    ... // 省略部分代码
    
    publicLRUMap(intinitialCapacity,floatloadFactor){
      super(initialCapacity, loadFactor, true);
    }

    ... // 省略部分代码
    
    /**
     * 重写LinkedHashMap中removeEldestEntry方法;
     * 新增元素的时候,会判断当前map大小是否超过DEFAULT_MAX_CAPACITY,超过则移除map中最老的节点;
     *
     * @param eldest
     * @return
     */
    protectedbooleanremoveEldestEntry(Map.Entry<K, V> eldest){
      return size() > DEFAULT_MAX_CAPACITY;
    }

  }

Thread Safe


/**
 * 读写锁
 */
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

private final Lock rLock = readWriteLock.readLock();

private final Lock wLock = readWriteLock.writeLock();

LinkedHashMap LRUMap ReentrantReadWriteLock n'est pas un thread Security, s'il est utilisé dans un environnement multithread sans contrôle, il y aura des problèmes. Par conséquent, un

verrouillage en lecture-écriture est introduit dans

pour contrôler les problèmes de concurrence.

Mécanisme d'expulsion du cache


protectedbooleanremoveEldestEntry(Map.Entry<K, V> eldest){
  return size() > DEFAULT_MAX_CAPACITY;
}

LinkedHashMap removeEldestEntry Remplacez la méthode map dans DEFAULT_MAX_CAPACITY ici, lorsque le cache est ajouté élément, il déterminera si la taille actuelle de

dépasse

, et si elle dépasse, le nœud le plus ancien de la carte sera supprimé.

Mécanisme de suppression du cache

ConcurrentHashMap timer Le mécanisme de suppression du cache est cohérent avec la mise en œuvre de

, les deux sont implémentés via

.

【Recommandations associées】1. Recommandation spéciale :

Téléchargement de la version V0.1 de "php Programmer Toolbox"

2.

Tutoriel vidéo gratuit Java

3

Manuel en ligne YMP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn