<a aria-pressed="true" class="btn btn-primary" data-colorbox-inline="#toc-js-node-5,224" data-width="90%" role="button"> Tabla de contenidos</a>

 

 Tags: [JEDIS](/taxonomy/term/68) [cache](/taxonomy/term/67) 

 

## 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é.

> &lt;env-entry&gt;  
>  &lt;env-entry-name&gt;aktek/CacheActivo&lt;/env-entry-name&gt;  
>  &lt;env-entry-value&gt;N&lt;/env-entry-value&gt;  
>  &lt;env-entry-type&gt;java.lang.String&lt;/env-entry-type&gt;  
>  &lt;/env-entry&gt;

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.

> &lt;env-entry&gt;  
>  &lt;env-entry-name&gt;aktek/CacheHost&lt;/env-entry-name&gt;  
>  &lt;env-entry-value&gt;127.0.0.1&lt;/env-entry-value&gt;  
>  &lt;env-entry-type&gt;java.lang.String&lt;/env-entry-type&gt;  
>  &lt;/env-entry&gt;



 



## 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 &lt;IP&gt;

###### Para hacer una consulta de llaves:

En desarrollo únicamente, se puede ejecutar

> `<strong>KEYS *</strong>`

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 &lt;llave&gt;:&lt;valor&gt;. 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(), &lt;tiempo de expiración en segundos&gt;);
> 
> }
> 
> // 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(&lt;llave&gt;);



 



## Cambiar tiempo de expiración.

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

> aktek.ws.logic.AvatarCache.ttl("&lt;llave&gt;");

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:

> `<span class="T286Pc" data-processed="true" data-sfc-cb="" data-sfc-cp="" data-sfc-root="c" jsaction="" jscontroller="fly6D" jsuid="doeLie_11">aktek.ws.logic.AvatarCache.setExpire("<llave>", <tiempo en segundos>)</span>`

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.



 



 

 

 Tabla de contenidos

 

 

 

## Procesos relacionados

- [Desarrollo](/jnum/desarrollo?c=cr)