Cacheando y acelerando con Redis, parte II

Publicado 11-09-2014

En esta parte veremos como utilizar Redis desde el shell Bash. No te pierdas todas las partes de la serie sobre Redis: Parte I, Parte II, y Parte III.

Puede parecer algo inútil pero lo haremos en primer lugar porque nos ayudará a comprender mejor como trabaja Redis y en segundo lugar porque seguro que en un futuro acabamos por encontrarle utilidad, y os dejo algunos escenarios o ideas:

  • Scripts de administración que necesitan comunicarse entre ellos e incluso entre distintos hosts. ¿Por qué no escribir y leer estados y órdenes en Redis? Quién haya tenido que hacer esto por sockets o por enviando órdenes por SSH está pensado ahora mismo en que no es mala idea.
  • Tareas de cron que deben actualizar estados para la aplicación.
  • Resultados de operaciones de backup que se muestran más tarde en un interfaz web.
  • Etc…

Sin más pasamos a ver cómo se usa desde shell y a hacer un script de ejemplo.

Usando Redis desde Bash

El Bash script es un lenguaje pegamento, es decir, no es un lenguaje de programación propiamente dicho sino que el intérprete es capaz de ejecutar procesos por lotes o scripts. Esto son ficheros de texto plano con comandos y algo de control de flujo básico, del tipo if, then, else, for, while, etc…

Por tanto no vamos a encontrar funciones o drivers para llamar a Redis, lo que vamos a hacer es pegar el comando externo redis-cli dentro de nuestro script.

Guardando un valor

Probemos esto desde la consola:

1root# echo "set prueba hola" | redis-cli
2OK

Redis ha guardado ese valor en su base de datos en RAM. Comprobémoslo:

Recuperando un valor

1root# echo "get prueba" | redis-cli
2"hola"

Correcto. Lo que hemos hecho es muy sencillo: a través del pipe o tubería (|) pasamos al cliente de Redis la salida de echo y la acepta como si lo estuviésemos tecleando.

Utilizaremos este comportamiento para integrar Redis dentro de cualquier script.

Un script de ejemplo

No nos vamos a matar, esto no es un curso de bash scripting y además si estás leyendo esto seguramente ya tienes al menos nociones, así que programaremos un sencillo script que guarde y recupere algunos valores.

Con tu editor favorito, crea el fichero prueba-redis.sh y escribe en él algo así:

 1#!/usr/bin/env bash
 2
 3echo "+-----------------+"
 4echo "| PRUEBA DE REDIS |"
 5echo "+-----------------+"
 6echo
 7echo "Hola, bienvenido a esta prueba."
 8
 9EXEC_COUNT=$(echo "get exec_count"|redis-cli)
10if [[ $EXEC_COUNT -gt 0 ]]
11then
12        echo "Has ejecutado esta prueba ${EXEC_COUNT} veces."
13else
14        echo "Es la primera vez que ejecutas esta prueba."
15fi
16echo "INCR exec_count" | redis-cli
17echo
18
19while [[ 1 ]]
20do
21        echo "MENU DE OPCIONES"
22        echo "1 - Guardar mis datos"
23        echo "2 - Ver mis datos"
24        echo "0 - Salir"
25        echo
26        read -p "Opcion? " OPC
27        case $OPC in
28                1)
29                        read -p "Cual es tu nombre? " FIRST_NAME
30                        echo "set first_name ${FIRST_NAME}" | redis-cli
31                        read -p "Y tu apellido? " LAST_NAME
32                        echo "set last_name ${LAST_NAME}" | redis-cli
33                        read -p "Y tu edad? " AGE
34                        echo "set age ${AGE}" | redis-cli
35                        ;;
36                2)
37                        FIRST_NAME=$(echo "get first_name" | redis-cli)
38                        LAST_NAME=$(echo "get last_name" | redis-cli)
39                        AGE=$(echo "get age" | redis-cli)
40                        echo
41                        echo "Te llamas ${FIRST_NAME} ${LAST_NAME} y tienes ${AGE}."
42                        ;;
43                0)
44                        echo "Adios"
45                        exit 0
46                        ;;
47        esac
48        sleep 2
49        echo
50done

No es muy espectacular, pero ¡Está bien para empezar! Juega un poco con él, lo interesante es que si sales y vuelves a entrar se acuerda de los datos, porque están en Redis.

Comentarios por Disqus