Implementar un objeto Cahce del algoritmo LRU basado en LinkedHashMap

¿Qué es LRU? Según el significado original directo del inglés, es Least Recent Used, que es el método menos utilizado recientemente. Se basa en una teoría básica muy famosa de los sistemas operativos informáticos: los datos de la página recientemente utilizados se seguirán utilizando en el futuro durante mucho tiempo. Es probable que las páginas no utilizadas no se utilicen durante un largo período de tiempo en el futuro . En base a esta idea, habrá un mecanismo de eliminación de caché, cada vez que se encuentren los datos no utilizados más largos de la memoria y luego se reemplacen, ¡para almacenar nuevos datos! Su indicador principal es el tiempo de uso y el indicador adicional es el número de usos. Este mecanismo es muy utilizado en computadoras. Su racionalidad radica en el cribado prioritario de datos calientes. ¡Los llamados datos calientes son los datos utilizados más recientemente! Porque usando LRU podemos resolver muchos problemas en el desarrollo real, y está en línea con los escenarios comerciales.

Requisitos : El tamaño de caché fijo maxCap es 3, después de alcanzar la capacidad máxima, el objeto utilizado menos recientemente se elimina de la caché.

package com.java.oop.features;
import java.util.LinkedHashMap;
//构建基于LRU算法的缓存对象(简易)
//缓存满了要淘汰长时间不访问的对象
class LruCache<K,V> extends LinkedHashMap<K,V>{
	  LinkedHashMap<K,V> removeElements=
			new LinkedHashMap<K, V>();//放移除的对象
	  private int maxCap;//记录最大容量
	  public LruCache(int cap) {
		super((int)Math.ceil(cap/0.75f)+1,0.75f,true);//调用父类有参构造,true表示访问顺序,false表示插入顺序
	    this.maxCap=cap;
	  }
	  //当我们执行put方法时,每次都会调用此方法
	  //方法返回值为true时表示满了,此时可以移除数据
	  @Override
	  protected boolean removeEldestEntry(
		java.util.Map.Entry<K, V> eldest) {
		boolean flag= size()>maxCap;
		if(flag) {
			removeElements.put(eldest.getKey(), eldest.getValue());
		}
		return flag;
	  }
}
public class TestExtends02 {
   public static void main(String[] args) {
	  LruCache<String,Object> cache=
	  new LruCache<>(3);
      cache.put("A", 100);
      cache.put("B", 200);
      cache.put("C", 300);
      cache.get("A");
      cache.put("D", 400);
      cache.put("E", 500);
      System.out.println(cache);
      System.out.println(cache.removeElements);
   } 
}

 

resultado de la operación:

{A=100, D=400, E=500}
{B=200, C=300}

 

 

Supongo que te gusta

Origin blog.csdn.net/qianzhitu/article/details/102988575
Recomendado
Clasificación