Quelle est la différence entre LRU et LFU implémentations de cache?
Je sais que LRU peut être implémenté en utilisant LinkedHashMap
. Mais comment implémenter le cache LFU?
Prenons un flux constant de demandes de cache avec une capacité de cache de 3, voir ci-dessous:
A, B, C, A, A, A, A, A, A, A, A, A, A, A, B, C, D
Si nous considérons simplement un cache le moins récemment utilisé (LRU) avec une implémentation de liste HashMap + doublement liée avec O(1) temps d'éviction et O(1) temps de chargement, nous aurions les éléments suivants mis en cache lors du traitement des demandes de mise en cache comme mentionné ci-dessus.
[A]
[A, B]
[A, B, C]
[B, C, A] <- a stream of As keeps A at the head of the list.
[C, A, B]
[A, B, C]
[B, C, D] <- here, we evict A, we can do better!
Lorsque vous regardez cet exemple, vous pouvez facilement voir que nous pouvons faire mieux - étant donné les chances plus élevées de demander un A à l'avenir, nous ne devrions pas l'expulser même s'il a été utilisé le moins récemment.
A - 12
B - 2
C - 2
D - 1
Le moins fréquemment utilisé (LFU) le cache tire parti de ces informations en gardant une trace du nombre de fois que la demande de cache a été utilisée dans son algorithme d'éviction.
LRU est un algorithme d'éviction de cache appelé cache le moins récemment utilisé .
Regardez ça ressource
LFU est un algorithme d'éviction de cache appelé cache le moins fréquemment utilisé .
Il nécessite trois structures de données. L'un est une table de hachage qui est utilisée pour mettre en cache la clé/les valeurs de sorte que, étant donné une clé, nous pouvons récupérer l'entrée de cache à O (1). La seconde est une liste à double lien pour chaque fréquence d'accès. La fréquence maximale est limitée à la taille du cache pour éviter de créer de plus en plus d'entrées de liste de fréquences. Si nous avons un cache de taille maximale 4, nous nous retrouverons avec 4 fréquences différentes. Chaque fréquence aura une double liste liée pour garder une trace des entrées de cache appartenant à cette fréquence particulière. La troisième structure de données consisterait en quelque sorte à relier ces listes de fréquences. Il peut s'agir d'un tableau ou d'une autre liste liée de sorte que lors de l'accès à une entrée de cache, il peut être facilement promu à la liste de fréquences suivante dans le temps O (1).
la principale différence est que dans LRU, nous vérifions uniquement sur quelle page est récemment celle qui a été utilisée dans le temps par rapport aux autres pages, c'est-à-dire que la vérification est basée uniquement sur les pages utilisées récemment. MAIS dans LFU, nous vérifions l'ancienne page ainsi que la fréquence de cette page et si la fréquence de la page est plus importante que l'ancienne page, nous ne pouvons pas la supprimer et si nous avons toutes les anciennes pages ayant la même fréquence, nous prenons la dernière ie FIFO pour cela. Et supprimer la page ....