[Diseño del sistema] Caché LRU

Lee este artículo

1. ¿Qué es la caché?

2. ¿Qué es la caché LRU?

3. Ideas de diseño de caché LRU

4. Interfaz de caché LRU

Que es caché

De hecho, la idea del almacenamiento en caché se puede ver en todas partes en la vida. Por ejemplo, nuestras estanterías están llenas de varios libros, pero recientemente quiero concentrarme en conquistar el curso de la estructura de datos. Por conveniencia, primero escribiré un libro relacionado con la estructura de datos. Bájelo de la estantería y colóquelo en nuestro escritorio, para que podamos recoger el libro mucho antes, sin tener que ir a la estantería a recoger el libro. En este ejemplo, el escritorio juega el papel de un caché .

En el ordenador sabemos que la eficiencia de acceder al disco es mucho menor que la de acceder a la memoria, es mucho menor, unos 10W, como se muestra en la siguiente figura.
[Diseño del sistema] Caché LRU
Sabemos que hay una ley del 28 muy famosa. De hecho, son muchas las situaciones en el mundo de la informática que obedecen a esta Ley. Por ejemplo, las características de las visitas al sitio web: el 80% de las visitas comerciales se concentran en el 20% de los datos. Entonces es natural pensar: dado que la mayor parte del acceso empresarial se concentra en una pequeña parte de los datos, si esta pequeña parte de los datos se almacena en la memoria mediante el diseño de una estructura de datos razonable, ¿mejorará en gran medida el rendimiento del sistema? Este es el caché.

Como se puede ver en lo anterior, ya sea en la vida o en el mundo de la informática, la caché tiene las siguientes dos características:

  • Mejorar la eficiencia del sistema

  • La capacidad es menor que la capacidad de almacenamiento externo, por ejemplo, la capacidad del escritorio es menor que la capacidad de la estantería y la capacidad de la memoria es menor que la capacidad del disco duro

¿Qué es la caché LRU?

Dado que la memoria es limitada, la caché siempre está llena. Luego, cuando la caché está llena, es necesario agregar nuevos datos a la caché. ¿Qué debemos hacer? No hay otra forma que eliminar los datos antiguos de la caché para dejar espacio para los nuevos. Entonces, ¿qué datos se eliminan de la caché original? Esto implica una estrategia de reemplazo de caché y LRU es una estrategia de caché.

LRU, abreviatura de Menos recientemente usado, se traduce como "menos recientemente usado". El algoritmo se basa en el principio de localidad del programa, y ​​su estrategia para eliminar los datos antiguos es que se eliminen los datos a los que no se ha accedido durante más tiempo desde la fecha actual.

Por ejemplo: Ahora hay un caché que puede almacenar 5 datos. Al principio, hay 3 datos A-> B-> C
[Diseño del sistema] Caché LRU
en el caché , como se muestra a continuación: Luego inserte 2 datos D-> E en el caché , La caché está llena en este momento. De la siguiente manera:
[Diseño del sistema] Caché LRU
Ok, ahora llegamos a acceder a los datos A, ahora A se ha convertido en el dato al que se ha accedido más recientemente, y B se ha convertido en el dato al que no se ha accedido durante más tiempo:
[Diseño del sistema] Caché LRU
ahora tenemos otro dato F que queremos insertar en la caché, porque la caché está llena Los datos antiguos deben eliminarse de la caché. En este momento, los datos B en la caché son los datos a los que no se ha accedido durante más tiempo desde la hora actual. Según el algoritmo LRU, eliminaremos los datos B: inserte F en la posición B actual.
[Diseño del sistema] Caché LRU
En este momento, los datos C se convierten en los datos a los que no se ha accedido durante más tiempo desde la hora actual, por lo que si llegan otros datos, deben insertarse en la posición actual de C, y así sucesivamente.

Diseño de caché LRU

La idea de entender la caché LRU es bastante simple, pero no es tan simple diseñar una caché LRU usted mismo Esta sección habla principalmente sobre las ideas de diseño de la caché LRU.

En primer lugar, se puede ver del análisis anterior que las principales operaciones de la caché LRU son la inserción, el borrado y la búsqueda. Por lo tanto, podemos considerar el uso de una lista de doble enlace para mantener la caché. La lista enlazada ordena los datos almacenados en caché de los más nuevos a los más antiguos por tiempo de acceso.

Si solo almacenamos los datos en la caché en una lista doblemente vinculada, cuando necesitamos encontrar datos de la caché, necesitamos recorrer la lista vinculada, y la complejidad de tiempo es O (n). Tal diseño es un enfoque relativamente ineficiente. Por lo tanto, además de mantener los datos en una lista doblemente enlazada, también mantenemos los datos en una tabla hash. La complejidad temporal del acceso a los datos de la tabla hash es O (1).

De acuerdo con el diseño anterior, una caché LRU contiene una lista doblemente enlazada y una tabla hash. La lista doble enlazada y un nodo de la tabla hash representan una unidad de caché en la caché, por lo que podemos definir la estructura de datos de nuestra unidad de caché de la siguiente manera:

//LRU缓存的缓存单元 
typedef struct cacheEntryS
{  
    char key;   //数据的key 
    char data;  // 数据的data

    struct cacheEntryS *hashListPrev; //指向哈希链表的前一个元素
    struct cacheEntryS *hashListNext; //指向哈希链表的后一个元素

    struct cacheEntryS *lruListPrev;  //指向链表的前一个元素
    struct cacheEntryS *lruListNext;  //指向链表后一个元素
}cacheEntryS;  

La estructura de datos de la caché LRU es la siguiente:

//定义LRU缓存
typedef struct LRUCacheS
{  
    int cacheCapacity;  //缓存的容量
    cacheEntryS **hashMap;  //缓存的哈希表

    cacheEntryS *lruListHead;//缓存的双向链表表头
    cacheEntryS *lruListTail;//缓存的双向链表表尾
    int lruListSize;    //缓存的双向链表节点个数
}LRUCacheS;  

Si una gran cantidad de código parece mareado, entonces debería poder entender el diagrama de estructura a continuación más a fondo. Tenga en cuenta que los punteros que no se señalan en la figura siguiente son NULL:
[Diseño del sistema] Caché LRU

Diseño de interfaz de caché LRU

A través del análisis anterior, no es difícil ver que las operaciones más importantes en una caché LRU no son más que crear, destruir, insertar datos y buscar datos. Estas interfaces se dan a continuación, en cuanto a la implementación específica, no la analizaré aquí. Habrá oportunidades para analizarlos uno por uno más tarde.

/*********************************************
函数名:LRUCacheCreate
功能:创建LRU缓存
输入参数:capacity,缓存的数据容量
输出参数:lruCache,指向新建缓存的指针
针返回值:0---成功     -1---失败

*********************************************/
int LRUCacheCreate(int capacity, void **lruCache);
/*********************************************
函数名:LRUCacheDestory
功能:销毁LRU缓存
输入参数:lruCache指向新建缓存的指针
输出参数:无
针返回值:0---成功     -1---失败
*********************************************/
int LRUCacheDestory(void *lruCache);
/*********************************************
函数名:LRUCacheSet
功能:将数据插入到LRU缓存中
输入参数:key:数据索引   data:数据内容
输出参数:无
针返回值:0---成功     -1---失败
*********************************************/
int LRUCacheSet(void *lruCache, char key, char data);
/*********************************************
函数名:LRUCacheGet
功能:将数据插入到LRU缓存中
输入参数:key:数据索引
输出参数:无
针返回值:缓存中存在key对应的data,返回
        缓存中不存在key对应的data,返回'\0'
*********************************************/
int LRUCacheGet(void *lruCache, char key);

Lectura recomendada:

[Beneficios] Compartir videos de cursos premium en línea recopilados por mí (
Parte 1 ) [Bosque del acuerdo] Cartero y oficina de correos (Descripción general del Protocolo de Internet)

[Estructura de datos y algoritmo] Explicación fácil de entender sobre la ordenación de bits
[Notas de C ++] Programación simultánea de C ++ 11 (1) Iniciar el viaje del hilo
[Notas de C ++] Puntos comunes para el uso de punteros de C / C ++
[Notas de C ++] Bibliotecas estáticas y dinámicas Detallado (encendido)

Codificación

¡El productor de códigos tiene la manera correcta de proporcionarle artículos técnicos fáciles de entender para facilitar la tecnología!

[Diseño del sistema] Caché LRU

Céntrese en compartir resumen de conocimientos de pila de tecnología de fondo del servidor

Bienvenido a prestar atención a la comunicación y al progreso común.

Supongo que te gusta

Origin blog.51cto.com/15006953/2552063
Recomendado
Clasificación