Pasar al contenido principal

Consideraciones Generales sobre el caché

  • Se incluye un motor de caché basado en REDIS, para aliviar la carga de la base de datos y mejorar la latencia. Sin embargo, para que sea realmente efectivo y no se convierta en un cuello de botella, se deberán seguir las reglas descritas en éste documento. 
  • REDIS  (Remote Dictionary Server) es una base de datos NoSQL de código abierto, en memoria, ultra rápida, que funciona como almacén de estructuras de datos clave-valor.
  • La comunicación con el motor del caché, se realizará a través de la librería Jedis 7.4.
  • Se actualizó el docker para que incorpore dentro de él el motor de caché, por lo que se debe utilizar la última versión de la imagen avatar-dev.
  • El caché se diseñó para que si el motor de caché falla, o no está disponible, el aplicativo no se verá afectado (pero funcionará sin caché). 
  • Para activar el caché, deben existir dos nuevas entradas en el web.xml:

La primera llamada aktek/CacheActivo, Si o No  S / N, indicará si se utilizará el caché.

    <env-entry>
     <env-entry-name>aktek/CacheActivo</env-entry-name>
     <env-entry-value>N</env-entry-value>
     <env-entry-type>java.lang.String</env-entry-type>
   </env-entry>

La segunda, aktek/CacheHost deberá apuntar al servidor de caché. En el ambiente de desarrollo, deberá ser 127.0.0.1. Solo se utilizará si el caché está activo.

   <env-entry>
     <env-entry-name>aktek/CacheHost</env-entry-name>
     <env-entry-value>127.0.0.1</env-entry-value>
     <env-entry-type>java.lang.String</env-entry-type>
   </env-entry>
 

 

Acceso a la base de datos del caché

La información se puede acceder a través del cliente Redis que se puede ejecutar desde la consola de comandos (en el ambiente de desarrollo, sería dentro del docker). 


Para conectarse al motor:

redis-cli -h <IP>

Para hacer una consulta de llaves:

En desarrollo únicamente, se puede ejecutar 

KEYS *

El producción ejecutar ese comando está prohibido porque se bloquea el motor. No se permite hacer un KEYS * tampoco desde el código JAVA, siempre debe utilizarse la llave a buscar.

 

Optimización de Llaves

La información se almacena en objetos del tipo <llave>:<valor>. En la llave, para efectos de optimizar las llaves y memoria, deben incorporarse nombres cortos pero descriptivos, entre más pequeña la llave, mejor. Para el valor, siempre deberá ser string que contenga un objeto JSONObject.   

Ejemplo de llave, en lugar de: 

"Sistema de Estudiantes:Expediente:Carnet:id:10900000"

Es mejor usar una llave corta: 

"MGE:M12ARC:M12CAR:10900000"

Implementación en el código

A nivel de programación, cuando se decida guardar algún elemento en la caché, siempre debe ejecutarse lo siguiente:

// Importar la librería

import aktek.ws.logic.AvatarCache;

// Variable para obtener la información del caché

  JSONObject joCache = null;

// Definir la llave a buscar en el caché

String strLlave = "";

// Obtener un valor del caché

String strValor = AvatarCache.get(strLlave);

// Validar si no está en caché

if (strValor != null) {

    // El valor que se necesita ya está en caché

    joCache = new JSONObject(strValor);

} else {

   // El valor que se necesita no está en el caché

  // Acá se deberá incluir la lógica necesaria  ( Consultas de BD, etc..)  que llenarán la informacion en el objeto joCache

 // Esta lógica deberá ser suficientemente pesada , para requerir que se guarde en el caché.

 // Se termina guardando ese json en el caché

 AvatarCache.set(strLlave, joCache.toString(), <tiempo de expiración en segundos>);

}

// Ahora se puede hacer lo que se necesite, con la información cargada en el objeto joCache

Eliminar una llave

Todas las llaves se eliminarán automáticamente cuando se alcance su tiempo de expiración.

Si se necesita eliminar alguna llave a través del código, será con:

aktek.ws.logic.AvatarCache.del(<llave>);

Cambiar tiempo de expiración.

Para averiguar el tiempo de expiración de una llave:

aktek.ws.logic.AvatarCache.ttl("<llave>");

Esto devolverá el tiempo de expiración en segundos.

-1 Si no tiene tiempo de expiración

-2 Si no se encuentra la llave

-3 Si hubo error.

Para cambiar el tiempo de expiración de una llave:

aktek.ws.logic.AvatarCache.setExpire("<llave>", <tiempo en segundos>)

Si la llave no existe, no tiene efecto.

Reglas de Oro

  1. Si se necesita insertar/actualizar/eliminar una llave en el caché, el orden es vital. Primero inserte/actualice/elimine en la Base de Datos y si eso no generó error, luego insertar/borrar/actualizar la llave en el caché.
  2. No utilizar el * para afectar muchos registros, ejemplo del("app:json:*") porque bloquearás Redis, ni tampoco utilizar un "KEYS *" en el motor de REDIS de producción.
  3. Todo el código que lea e inserte en caché, debe cumplir con lo indicado en la sección de Implementación.

     

Procesos relacionados