Principes de conception du cache Guava, Introduction à la base Java

Harmonios Learning 2021-11-25 18:30:11
principes conception du cache guava

ChaqueReferenceEntryLes entrées du tableau sont toutes uneReferenceEntryChaîne.

Guava CachePrincipes de conception du cache,javaIntroduction de base_Interview

UnReferenceEntryContientkey、hash、value Reference、nextChamp,Sauf dansReferenceEntryChaîne constituée dans un élément de tableau.

ReferenceEntryPeut être fortement référencékey,C'est possible.WeakReferenceTypekey,Pour réduire l'utilisation de la mémoire,Peut également être configuré en fonction deexpireAfterWrite、expireAfterAccess、maximumSizePour décider siwriteChaîne etaccessLa chaîne détermine les détails à créerReference:StrongEntry、StrongWriteEntry、StrongAccessEntry、StrongWriteAccessEntryAttendez..

 ReferenceEntryInterface

  • reference mapNoeud dans

Guava CachePrincipes de conception du cache,javaIntroduction de base_Interview_02

map Le noeud central peut être dans l'état suivant :

Efficace:

  • Live: Une clé valide est définie /Valeur

  • Loading:Chargement

Invalide:

  • Expired:Le temps est écoulé.(Clé/ Les valeurs peuvent encore être définies )

  • Collected:Clé/ Valeur partiellement collectée , Mais pas encore nettoyé

  • Unset: Marqué comme non défini , En attente de nettoyage ou de réutilisation

 ValueReference

ValueRéférences

Guava CachePrincipes de conception du cache,javaIntroduction de base_Interview_03

Pourquoi?ReferenceLes ordres,Parce queCachePour soutenir:

  • WeakReference K

  • SoftReference、WeakReference V

ValueReference Parce queCache Prise en charge des Value、SoftReference ValueEtWeakReference Value, Il correspond donc à trois classes d'implémentation :StrongValueReference、SoftValueReference、WeakValueReference.

 LoadingValueReference

Pour soutenir le mécanisme de chargement dynamique ,Il en a un autre.LoadingValueReference, Un chargement dynamique est nécessaire keyLorsque la valeur de:

  • Emballez d'abord cette valeur dans LoadingValueReference, Pour exprimer key La valeur correspondante est déjà chargée

  • Si d'autres Threads doivent également interroger keyLa valeur correspondante, Pour obtenir cette citation , Et attendre que la valeur soit chargée ,Par Assurez - vous que la valeur n'est chargée qu'une seule fois

  • Une fois la valeur chargée ,Oui.LoadingValueReference Remplacer par un autre ValueReferenceType

ValueReference La paire est conservée dans l'objet ReferenceEntryRéférences,C'est parce queValueParce queWeakReference、SoftReferenceLorsqu'il est recyclé, Besoin de l'utiliser key Retirer l'élément correspondant de SegmentDetableSupprimer dans.

 Queue

Dans unSegmentMoyenne,Tous lesReferenceEntry Composition :

  • accessChaîne(accessQueue)

  • writeChaîne(writeQueue)

Pour réaliserLRU,Guava CacheInSegment Ces deux chaînes ajoutées dans , Ce sont des listes bidirectionnelles ,AdoptionReferenceEntry Le lien suivant dans :

  • previousInWriteQueue

  • nextInWriteQueue

  • previousInAccessQueue

  • nextInAccessQueue

 WriteQueue

Guava CachePrincipes de conception du cache,javaIntroduction de base_Java_04

 AccessQueue

Guava CachePrincipes de conception du cache,javaIntroduction de base_Interview_05

WriteQueueEtAccessQueue Tout est personnalisé offer、peek、remove、pollAttendre l'opération:

Guava CachePrincipes de conception du cache,javaIntroduction de base_Développement de l'arrière - plan_06

offerFonctionnement,Si:

  • Nouveau noeud

Directement à la fin de la chaîne

  • Noeud existant

La queue de la chaîne qui relie ce noeud

removeFonctionnement:

Retirer le noeud directement de la chaîne

pollFonctionnement:

Supprimer le noeud suivant du noeud de tête ,Et revenir à.

  Opérations liées au cache


 SegmentDeevictPolitique de nettoyage


Déclenche le nettoyage au début et à la fin de chaque opération d'appel , Ceci est comparé au nettoyage normal du moniteur de fil de cache Save , Réduit les frais généraux .

Mais si la méthode n'est pas appelée depuis longtemps , Cela peut entraîner un nettoyage intempestif pour libérer de l'espace mémoire .

evict Il s'occupe principalement de quatre Queue:

  • keyReferenceQueue

  • valueReferenceQueue

  • writeQueue

  • accessQueue

Les deux premiersqueueParce queWeakReference、SoftReference Ajouté lors de la collecte des ordures , Il suffit de traverser tout le queue, Faire correspondre les entrées de LocalCacheSupprimer:

  • keyReferenceQueueStockageReferenceEntry

  • valueReferenceQueueCe qui est stockéValueReference

À partir deCache Supprimer dans nécessite key,Et doncValueReferenceIl faut avoir raison.ReferenceEntryRéférences.

Les deux derniersQueue, Il suffit de vérifier si les expireTemps, Et chercher à partir de zéro ce qui est déjà expireDeEntry, Enlevez - les .

SegmentDansputFonctionnement:put Fonctionnement relativement simple , Il faut d'abord qu'il obtienne la serrure , Et essayer de nettoyer , La logique qui suit est similaire ConcurrentHashMapDansrehash, Localiser et injecter des données . Ce qu'il faut expliquer, c'est quand on trouve un EntryHeure, Il faut d'abord juger ValueRefernece La valeur dans a été effectivement recyclée , Parce qu'ils peuvent être WeakReference、SoftReferenceType, Si elle a été recyclée , Alors écrivez la nouvelle valeur à . Et enregistre les événements de suppression causés par l'opération courante à chaque mise à jour , Préciser la raison correspondante :COLLECTED、REPLACEDAttendez., Ces événements enregistrés sont appelés uniformément à la sortie CacheEnregistréRemovalListener, Comme la gestion des événements peut prendre beaucoup de temps , Donc ici, la logique de gestion d'événements n'est faite qu'après la sortie de la serrure .Enfin, Mise à jour des Entry Après ça, j'ai essayé de mettre ceux qui expireDeEntrySupprimer.En plusput Une mise à jour est également nécessaire pendant l'opération writeQueueEtaccessQueue L'exactitude sémantique de .

SegmentAvecCacheLoaderDegetFonctionnement

V get(K key, int hash, CacheLoader<? super K, V> loader) throws ExecutionException {

checkNotNull(key);

checkNotNull(loader);

try {

if (count != 0) { // read-volatile

// don’t call getLiveEntry, which would ignore loading values

ReferenceEntry<K, V> e = getEntry(key, hash);

if (e != null) {

long now = map.ticker.read();

V value = getLiveValue(e, now);

if (value != null) {

recordRead(e, now);

statsCounter.recordHits(1);

return scheduleRefresh(e, key, hash, value, now, loader);

}

ValueReference<K, V> valueReference = e.getValueReference();

if (valueReference.isLoading()) {

return waitForLoadingValue(e, key, valueReference);

}

}

}

// at this point e is either null or expired;

return lockedGetOrLoad(key, hash, loader);

} catch (ExecutionException ee) {

Throwable cause = ee.getCause();

if (cause instanceof Error) {

throw new ExecutionError((Error) cause);

} else if (cause instanceof RuntimeException) {

throw new UncheckedExecutionException(cause);

}

throw ee;

} finally {

postReadCleanup();

}

}

1. Cherche d'abord.table Existe - t - il déjà dans le qui n'a pas été recyclé 、Pas du tout.expireDeentry,Si vous trouvez,Et dansCacheBuilderConfiguré dansrefreshAfterWrite, Et l'intervalle de temps actuel a fonctionné sur cet événement , Recharger la valeur ,Sinon, Renvoie directement la valeur originale

2. Si on trouveValueReference- Oui.LoadingValueReference, Attendez que LoadingValueReferenceFin du chargement, Et renvoie la valeur chargée

Guava CachePrincipes de conception du cache,javaIntroduction de base_Interview_07

3. Si vous ne trouvez pasentry, Ou trouvé entryLa valeur denull, Après la fermeture ,Continue.table La recherche existe déjà keyCorrespondantentry, Si trouvé et correspond à entry.isLoading()Pourtrue, Indique qu'un autre thread est chargé , Alors attendez que ce thread soit chargé , Si vous trouvez un non nullValeur,Renvoie la valeur,Sinon, créez unLoadingValueReference

Guava CachePrincipes de conception du cache,javaIntroduction de base_Java_08

Et appelleloadSync Charger les valeurs appropriées

Guava CachePrincipes de conception du cache,javaIntroduction de base_Java_09

Une fois le chargement terminé, Mettre à jour la valeur nouvellement chargée à tableMoyenne, C'est - à - dire, dans la plupart des cas, remplacer l'original LoadingValueReference

 CacheBuilder

Apprendre à partager,Co - encouragement

Voici les ressources d'apprentissage de Xiao Bian.,Il s'agit notamment de“Moyenne et supérieureJavaDévelopper des notes pour les questions d'entrevue à haute fréquence300Dow..pdf”Et“JavaNotes sur le système de connaissances de base.pdf”Partage de fichiers,Riche en contenu,**Oui.JVM、Verrouillage、Concurrence、Java

《Grandes usines de première ligneJavaAnalyse des questions d'entrevue+Notes d'apprentissage pour le développement de l'arrière - plan+La dernière vidéo d'architecture+Document d'information sur le code source du projet en direct》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 Partage open source du contenu complet

Réflexe、SpringPrincipes、Microservices、Zookeeper、Base de données、Beaucoup de points de connaissance tels que la structure des données.En même temps,JavaCarte cérébrale des notes de connaissances pour l'apprentissage avancé(Contient beaucoup de notes d'apprentissage)!**

Le tri des données n'est pas facile,Les Amis lecteurs peuvent partager!

JavaNotes sur le système de connaissances de base.pdf

Guava CachePrincipes de conception du cache,javaIntroduction de base_Interview_10

Moyenne et supérieureJavaDévelopper des notes pour les questions d'entrevue à haute fréquence300Dow..pdf

Guava CachePrincipes de conception du cache,javaIntroduction de base_Java_11

Architecture Advanced interview Topic and Architecture Learning notes Brain graph

Guava CachePrincipes de conception du cache,javaIntroduction de base_Interview_12

JavaArchitecture Advanced Learning Video Sharing

Cet article a été publié par CODINGProjet Open Source:【Grandes usines de première ligneJavaAnalyse des questions d'entrevue+Résumé de base notes d'étude+Dernière vidéo d'explication+Code source du projet opérationnel】Inclus

版权声明
本文为[Harmonios Learning]所创,转载请带上原文链接,感谢
https://javamana.com/2021/11/20211125182532023o.html

  1. Java经典面试题详解,突围金九银十面试季(附详细答案,mysql集群架构部署方案
  2. java整理,java高级特性编程及实战第一章
  3. java教程——反射,mongodb下载教程
  4. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day12,zookeeper原理作用
  5. Java后端互联网500道中高级面试题(含答案),linux钩子技术
  6. java8 Stream API及常用方法,java初级程序员面试
  7. java-集合-Map(双列)——迪迦重制版,2021Java开发社招面试解答之性能优化
  8. Flink处理函数实战之二:ProcessFunction类,java线程面试题目
  9. flex 布局详解,【Java面试题
  10. Linux basic command learning
  11. Why did docker lose to kubernetes? Docker employee readme!
  12. MySQL安装
  13. Elastic Search Aggregate Learning five: Problem Analysis of Uncertainty of sequencing results, Alibaba Java Performance Tuning Practical
  14. Installing, configuring, starting and accessing rabbitmq under Linux
  15. Oracle SQL injection summary
  16. Installation MySQL
  17. L'exposition à la photo d'essai sur la route i7 du nouveau vaisseau amiral de BMW Pure Electric a également été comparée à celle de Xiaopeng p7.
  18. spring JTA 关于异常处理的时机问题
  19. Le problème du temps de traitement des exceptions dans la JTA printanière
  20. Flink Handling Function Real War II: processfunction class, Java thread interview subject
  21. Oracle SQL injection summary
  22. [Java data structure] you must master the classic example of linked list interview (with super detailed illustration and code)
  23. Do you really know MySQL order by
  24. Record a java reference passing problem
  25. spring JTA 關於异常處理的時機問題
  26. Java - Set - Map (double file) - dija Rewriting, 2021 Java Developer's Performance Optimization
  27. Android入门教程 | OkHttp + Retrofit 取消请求的方法
  28. Java 8 Stream API and common methods, Java Junior Program interview
  29. Github 疯传!史上最强!BAT 大佬,2021年最新Java大厂面试笔试题分享
  30. git(3)Git 分支,zookeeper下载教程
  31. Java Backend Internet 500 questions d'entrevue moyennes et avancées (y compris les réponses), technologie de crochet Linux
  32. Entretien d'entretien d'usine Java post sprint de 100 jours - accumulation de jours et de mois, trois questions par jour [jour 12, fonction de principe de Zookeeper
  33. Tutoriel Java - reflection, tutoriel de téléchargement mongodb
  34. How to analyze several common key and hot issues in redis from multiple dimensions
  35. GIT (3) GIT Branch, Zookeeper Download tutoriel
  36. Tutoriel de démarrage Android | okhttp + Retrofit comment annuler une demande
  37. Design pattern [3.3] - Interpretation of cglib dynamic agent source code
  38. Share the actual operation of private collection project nodejs backend + Vue + Mysql to build a management system
  39. Springboot has 44 application initiators
  40. GitHub上霸榜久居不下的《Java面试突击宝典》,java图形用户界面设计基础
  41. GitHub上访问下载破百万的神仙文档《Java面试神技》看完我呆了,java面试问项目中遇到的问题
  42. GitHub上标星75k 超牛的《Java面试突击版,java高级工程师技能
  43. GitHub上标星2,java项目开发实训教程
  44. Docker development environment Preview
  45. JavaScript高級深入淺出:掌握 this 指向
  46. JavaScript Advanced Insight and outside: Mastering this direction
  47. Vue de l'application pratique de Javascript, drop drag Event
  48. docker 安装部署 Jenkins 2.322
  49. kafka安装
  50. 近九万字图文详解RabbitMQ
  51. Engaged in Java for one and a half years, how to break through yourself
  52. 输出9*9乘法表----java
  53. 判断一个数是不是素数-------java
  54. java项目,记录页面修改值,内部打“官司”用
  55. Docker installation Deployment Jenkins 2.322
  56. Comment porter un pantalon en hiver? Les petits hommes, les jambes épaisses et la largeur de l'entrejambe peuvent être vus. 3 techniques pour éviter la foudre
  57. MySQL下载和安装教程
  58. In depth analysis of rocketmq source code - message storage module
  59. Spring transaction management
  60. mysql恢复ibd数据,为何频频报错?