Cargando

Parte de mi trabajo consiste en mantener una aplicación en PHP un poco antigua y programada sin muchos conocimientos, por ende, con muchas malas prácticas. El caso es que por varias semanas, quizá un par de meses una lista generada en el sistema por esta persona, paginado a 100 items por vez cargaba extremadamente lento y no sabía cuál era la causa. El resultado fue que en medio del bucle había una llamada a un servicio web. Es impresionante lo importante que es la latencia cuando desarrollamos aplicaciones. En fin, el sólo hecho de hacer esa consulta al servicio web ralentizaba todo lo demás haciendo tediosa la navegación, pero si comentaba la variable, el bucle funcionaba perfectamente.

En el caso en cuestión no había una manera efectiva de obtener el dato buscado de otra forma, así que decidí buscar alguna alternativa y rápidamente llegué a descubrir tres herramientas:

  • memcached: Es un “sistema de cacheo de objetos” y un sistema de cacheo de objetos se utiliza para guardar objetos y recuperarlos más rápido. En este caso, memcached guarda los datos en la memoria RAM de acuerdo a una clave y valor. Es bien sencillo de instalar, ya está suficientemente explicado cómo instalar memcached aquí.

  • redis: Es una versión enchulada o mejorada del mismo principio. La mayor diferencia es que memcached sólo guarda objetos en clave => valor (como en un arreglo asociativo) pero Redis permite trabajar con estructuras de datos de distinto tipo. Hay un tutorial básico en try.redis.io

  • Laravel (caché) (otra vez). No es una herramienta específica para cachear sino la habilidad de poder utilizar la caché dentro del sistema sin tener que instalar nada adicional. Permite usar memcached y redis con una sintaxis más familiar, pero también usar la base de datos y hasta un archivo como memoria caché. Esto siempre y cuando uses Laravel. La caché de Laravel explicada en castellano acá.

Para ejemplificar con PHP, lo que queremos cambiar es esto:

$var = file_get_contents($url_de_la_api);

Por algo así (en pseudo php):

$dato_en_caché = $dato_en_caché ?? cache('dato', file_get_contents($url_de_la_api), $expiracion);
$var = $dato_en_cache;

Al final curiosamente terminé usando la base de datos con una simple tabla pero instalé memcached para probarlo, (y porque necesito que mis datos cacheados “caduquen” y se recarguen) ya que sería más rápido, entonces no gano mucho poniendo todo en la base.

Este tema no es menor si uno está entrando al mercado laboral informático, porque muchas ofertas de trabajo incluyen el requerimiento de conocer o haber utilizado Redis (memcached no tiene mayor dificultad en aprender a usarse pero redis tiene, por ejemplo, un lenguaje con una sintaxis propia). Si tu aplicación es comercial y puede cargar más rápido, entonces probablemente es rentable saber manejar este tema.

Miren, ofertas que piden saber Redis