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
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
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
, timer.schedule sera appelé pour charger la tâche de vider le cache.
Implémentation basée sur LinkedHashMapLinkedHashMap
LinkedHashMap
utilise LRU
comme structure de stockage de cache. La stratégie
.
LRULRU
Least Recently Used
, 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 LRULinkedHashMap
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
.
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
pour contrôler les problèmes de concurrence.
Mécanisme d'expulsion du cacheprotectedbooleanremoveEldestEntry(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
, et si elle dépasse, le nœud le plus ancien de la carte sera supprimé.
Mécanisme de suppression du cacheConcurrentHashMap
timer
Le mécanisme de suppression du cache est cohérent avec la mise en œuvre de
.
【Recommandations associées】1. Recommandation spéciale :
Téléchargement de la version V0.1 de "php Programmer Toolbox"Tutoriel vidéo gratuit JavaManuel en ligne YMPCe 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!