Curso Básico de Redis – Parte 04

Dificultad: Fácil
Tiempo de Lectura: 4 minutos

Hemos llegado a la parte final de nuestro curso básico de Redis. Hasta ahora hemos visto sus comandos básicos e importantes, que te guían de como realizar los diferentes tipos de consultas hacia esta increíble base de datos.

También vimos como utilizar los mismos comandos a través de php. Si estuvieron atento a los artículos anteriores, notaran que utilizar redis es muy sencillo.

Ahora tenemos un nuevo reto, en esta ocasión vamos a hacer nuestro servidor node aun mas rápido almacenando las respuestas en cache, por supuesto con Redis.

Como el articulo anterior, teníamos que tener ciertas configuraciones previa para poder ejecutar redis en php. En esta oportunidad tenemos que tener configurado Node.

Una vez que tengamos configurado node, creamos una carpeta donde vamos a crear el archivo package.json. Que nos servirá para instalar las librerías necesarias para utilizar redis con node.

A través de la consola, vamos a la carpeta que creamos y ejecutamos el siguiente comando para configurar el archivo que mencionamos anteriormente.

npm init

Al ejecutar este comando abrirá una serie de opciones que llenaremos con la información correspondiente. Por ahora colocaremos la información mas básica ya que lo usaremos para el demo. Los datos que tendrán que llenar, lucirían algo parecido a esto.

Nota: Si quieren dejar un nombre o especificación por defecto solo hacen click en enter y se tomara el valor que esta entre los paréntesis “()”.

name: (noderedis) 
version: (1.0.0) 
description: Demo node con redis / guiadev.com
entry point: (index.js) 
test command: 
git repository: 
keywords: 
author: guiadev
license: (ISC) MIT
About to write to /home/edgar/Documentos/sis/noderedis/package.json:

{
 "name": "noderedis",
 "version": "1.0.0",
 "description": "Demo node con redis / guiadev.com",
 "main": "index.js",
 "scripts": {
 "test": "echo \"Error: no test specified\" && exit 1"
 },
 "author": "guiadev",
 "license": "MIT"
}

Is this ok? (yes) yes

Si están de acuerdo con la configuración, escriben simplemente yes y presionan enter. Una vez hecho eso, les generara el archivo llamado package.json. Este archivo es el que utilizara node para agregar todas las dependencias que utilizaremos en este ejemplo.

Ahora bien, ya que tenemos el package.json, tenemos que instalar redis y express. Para ello ejecutamos lo siguiente en la consola.

npm install --save redis express

Ahora en nuestro archivo quedaría algo así.

{
 "name": "noderedis",
 "version": "1.0.0",
 "description": "Demo node con redis / guiadev.com",
 "main": "index.js",
 "scripts": {
 "test": "echo \"Error: no test specified\" && exit 1"
 },
 "author": "guiadev",
 "license": "MIT",
 "dependencies": {
 "express": "^4.16.2",
 "redis": "^2.8.0"
 }
}

Definiendo base de datos

Para este demo vamos a definir una “base de datos” el cual simplemente sera una constante simulando ser una base de datos. Para ello creamos un archivo llamado edades.js.

En dicho archivo definiremos la constante edades.

const edades = {
 Juan: '15',
 Anna: '7',
 Jesus: '28',
 Miguel: '45'
}

En este mismo archivo vamos a escribir una función que se encargara hacer la petición a la constante y funcionara como si hiciera una petición a la base de datos. Para emular el tiempo de respuesta de la base de datos, vamos a colocar un setTimeout con un delay de un segundo.

const edadbd = (nombre, cbf) => setTimeout(() => {

//Aplicamos un mensaje para emular la conexion a la bd
 console.log('obteniendo datos de la base de datos')

//Validamos la constante edad en caso de que venga vacia.
 const edad = edades[nombre] || 'Valor no existe'

// Devolvemos el valor a traves de la funcion callback
 cbf(edad)
}, 1000)

module.exports = edadbd

Ademas de este archivo, tenemos que crear el archivo principal (index.js) para poder iniciar el servidor de node. Esta configuración en sencilla, por lo que pegamos el siguiente código en dicho archivo.

const express = require('express');
const app = express();

//incluimos el archivo de edades que creamos
const servicioEdades = require('./edades.js');

app.get('/', function(req, res) {

const {nombre} = req.query
 servicioEdades(nombre, edad => {
 res.end(edad)
 })
});

app.listen(3000, function() {
 console.log('Node corriendo por el puerto 3000');
});

Para iniciar el servicio de node simplemente vamos a la carpeta raíz del proyecto y ejecutamos el siguiente comando.

node index

Ahora para ver el resultado de lo que acabamos de hacer podemos ir al siguiente enlace.

http://localhost:3000/?nombre=Anna

Si todo esta correcto deberíamos de recibir como resultado “7”, que es la edad que le asignamos a Anna en la constante “edades”.

Pero, ahora como podemos medir el tiempo de respuesta de esta petición? Ejecutamos el siguiente código en la consola.

curl -w "\ntiempo : %{time_total}\n" "http://localhost:3000/?nombre=Juan"

Tendremos como resultado lo siguiente

15
tiempo : 1,007

Almacenando las peticiones

Ahora bien, lo mas interesante. Vamos a manejar el cache de la peticiones con Redis. Para ello tenemos que hacer algunos cambios en el archivo que creamos anteriormente y crear uno nuevo con el nombre de “cache.js” con el siguiente contenido.

const redis = require('redis')
const client = redis.createClient()

//Mostramos un mensaje es caso de que exista un error
client.on("error", function(err) {
 console.log("Error " + err);
})

module.exports = client

Ahora tenemos que modificar el archivo “edades.js” para que funcione con la inclusión de la librería de redis.

//Importamos el archivo donde configuramos redis
const cache = require('./cache');

const edades = {
 Juan: '15',
 Anna: '7',
 Jesus: '28',
 Miguel: '45'
}

const edadbd = (nombre, cbf) => setTimeout(() => {

//Aplicamos un mensaje para emular la conexion a la bd
 console.log('obteniendo datos de la base de datos')

//Validamos la constante edad en caso de que venga vacia.
 const edad = edades[nombre] || 'Valor no existe'

// Devolvemos el valor a traves de la funcion callback
 cbf(edad)
}, 1000)

// Ahora no exportamos la variable edadbd sino una funcion
module.exports = (nombre, cbf) => {

//Verificamos que la edad exista en la cache
 cache.get(nombre, (err, edad) => {
 if (edad !== null) {
 //Si es diferente de null devuelve la edad al callback
 return cbf(edad)
 }

//En esta seccion la edad que buscamos no existe en la cache
 edadbd(nombre, edad => {
 //Una vez que tenemos la edad la incluimos en la cache.
 cache.set(nombre, edad, () => {
 //devolvemos edad en el callback
 cbf(edad)
 })
 })
 })
}

Ahora, para hacer la prueba tenemos que iniciar el servicio de redis. Para ello podemos ir al directorio donde instalamos redis y ejecutar.

src/redis-server

Puedes hacer un repaso a través del primer capitulo de este curso.

Para medir el tiempo ejecutamos la misma instrucción de antes desde la consola.

curl -w "\ntiempo : %{time_total}\n" "http://localhost:3000/?nombre=Juan"

Tenemos como resultado

15
tiempo : 1,023

Si lo ejecutamos de nuevo, veremos la diferencia.

curl -w "\ntiempo : %{time_total}\n" "http://localhost:3000/?nombre=Juan"

Tenemos como resultado

15
tiempo : 0,008

Conclusión

Ya vimos como utilizar los comandos básicos de redis a través de la consola, php y node. Demostrando que se puede adaptar a cualquier lenguaje de programación y lo versatil que puede ser redis en nuestros desarrollos. Espero haya sido de tu agrado este Curso Básico de Redis. Nos vemos pronto!!


¿Te resultó útil el artículo? Compártelo con tus colegas: