Aprenderá dos técnicas de almacenamiento y recuperación de datos. A la hora de elegir qué método utilizar en su aplicación, seleccione aquel que simplifique su arquitectura según sus patrones de acceso a los datos.

Pero, primero, asegúrese de poder conectarse a Redis.

Tiempo de realización del módulo: 60 minutos



Paso 4.1

(Hacer clic para ampliar)

Paso 4.1
Paso 4.2

(Hacer clic para ampliar)

Paso 4.2

En los ejemplos, cada vez que se menciona un punto de enlace, debe usar el nombre de host de su punto de enlace de configuración.

Paso 4.3

(Hacer clic para ampliar)

Paso 4.3

sintaxis: shell

$ python

Si los comandos no responden, consulte la nota que aparece a continuación del ejemplo. 

sintaxis: python

syntax: python
>>> import redis
>>> client = redis.Redis.from_url('redis://endpoint:6379')
>>> client.ping()

True

Nota: Si no responde, significa que la configuración del grupo de seguridad lo está bloqueando. Verifique que la instancia EC2 tenga acceso al grupo de seguridad asignado a su instancia de ElastiCache. Por ejemplo, supongamos que la instancia EC2 se asignó al grupo de seguridad predeterminado. Ahora puede modificar el grupo de seguridad de su instancia de Amazon ElastiCache y agregar una regla de TCP personalizada, lo que permite las conexiones en el puerto 6379 desde cualquier instancia en el grupo de seguridad predeterminado:

En Origen, puede comenzar a escribir el nombre del grupo de seguridad y, luego, podrá hacer clic en el ID del grupo de seguridad. Si necesita obtener más información sobre los grupos de seguridad, puede consultar la documentación o la Referencia de reglas de grupos de seguridad.

Paso 4.5

(Hacer clic para ampliar)

Paso 4.5

En el repositorio, encontrará algunas líneas de código Python que puede ejecutar en la instancia EC2. Sin embargo, primero debe configurar algunas variables del entorno:

sintaxis: shell

$ export REDIS_URL=redis://your_redis_endpoint:6379/
$ export DB_HOST=your_mysql_endpoint
$ export DB_USER=admin
$ export DB_PASS=your_admin_password
$ export DB_NAME=tutorial

Observe que los valores para mysql_endpoint, redis_endpoint y password son los mismos que guardó en los pasos previos.


El primero de los dos métodos implementados en la muestra de código funciona a través del almacenamiento en caché de una representación organizada en serie del resultado de la consulta SQL. El siguiente fragmento de Python ilustra la lógica:

sintaxis: python

def fetch(sql):

  result = cache.get(sql)
  if result:
    return deserialize(result)
  else:
    result = db.query(sql)
    cache.setex(sql, ttl, serialize(result))
    return result

Primero, se utiliza la instrucción SQL como clave en Redis y la caché se examina para ver si hay un valor presente. Si no se encuentra el valor, la instrucción SQL se utiliza para consultar la base de datos. El resultado de la consulta a la base de datos se almacena en Redis. La variable TTL (tiempo de vida) debe establecerse en un valor razonable según la naturaleza de su aplicación. Cuando vence el TTL, Redis expulsa la clave y libera la memoria asociada. Este código está disponible en el repositorio del tutorial, y puede ejecutarlo tal como está, pero también tiene permitido agregar instrucciones print en distintos lugares si desea ver el valor de una variable en determinado momento.

En términos de estrategia, la desventaja de este enfoque es que cuando se modifica información en la base de datos, los cambios no se verán reflejados de manera automática para el usuario si se almacenó en caché un resultado anterior y su TTL aún no ha transcurrido.

Un ejemplo de cómo usaría la función de búsqueda sería el siguiente:

sintaxis: python

print(fetch("SELECT * FROM planet"))

El resultado sería el siguiente:

sintaxis: python

[{'id': 10, 'name': 'Mercury'},
 {'id': 11, 'name': 'Venus'},
 {'id': 12, 'name': 'Earth'},
 {'id': 13, 'name': 'Mars'},
 {'id': 14, 'name': 'Jupiter'},
 {'id': 15, 'name': 'Saturn'},
 {'id': 16, 'name': 'Uranus'},
 {'id': 17, 'name': 'Neptune'}]

Por supuesto, este es un ejemplo muy básico, pero su aplicación puede beneficiarse en gran medida si implementa este patrón de almacenamiento en caché donde no existe diferencia entre un resultado que proviene de la caché y uno que proviene directamente de la base de datos.


El segundo ejemplo que implementará asigna un registro de la base de datos a un hash de Redis:

sintaxis: python

def planet(id):

  key = "planet:" + str(id)
  result = cache.hgetall(key)

  if result:
      return result

  else:
      sql = "SELECT `id`, `name` FROM `planet` WHERE `id`=%s"
      result = db_record(sql, (id,))

      if result:
          cache.hmset(key, result)
          cache.expire(key, ttl)
      return result

El espacio de claves en Redis es plano, pero existe una convención que se utiliza para simular estructura con cadenas separadas por dos puntos. En el ejemplo, la clave para el registro con ID 1 será “planet:1”. Si bien este fragmento es suficiente para exhibir un patrón común, es posible tener más abstracción: un módulo podría encargarse de generar las claves, otro podría hacerse cargo de crear la cadena SQL, etc. Además, lo más probable es que existan herramientas creadas para ese propósito en el lenguaje de programación que utiliza.
El ejemplo recupera registros ya sea de la caché o de la base de datos. De manera similar, podría existir una función que se encargue de conservar un objeto en la base de datos.


En los dos ejemplos, utilizó un Tiempo de vida o TTL, después del cual Redis expulsa la clave. Si bien esto es suficiente en la mayoría de los casos, tal vez prefiera eliminar los datos obsoletos de la caché tan pronto como sea posible. Si ese es su caso de uso, asegúrese de revisar otras opciones, como la estrategia de almacenamiento en caché con escritura directa (write-through). Al final de este tutorial, se proporcionan enlaces con más información. Cabe mencionar en caso de que sienta curiosidad, que si bien los ejemplos usan el comando EXPIRE, Redis también proporciona el comando EXPIREAT, el cual le permite especificar una fecha y hora precisas a partir de las cuales se debe expulsar una clave. Toma como parámetro una marca temporal absoluta de Unix (es decir, los segundos que han transcurrido desde el 1.º de enero de 1970).


Cuando la cantidad de datos supera el ajuste configurado para la memoria máxima, Redis cuenta con diferentes maneras de responder según la política de expulsión seleccionada. De manera predeterminada, ElastiCache for Redis está configurado para que elimine de la memoria las claves para las que ha transcurrido más tiempo desde su último uso con un TTL establecido. El parámetro de la política de expulsión se llama maxmemory-policy, y el valor predeterminado en ElastiCache es volatile-lru. Otra opción interesante para este caso de uso es la política volatile-ttl, la cual indica a Redis que recupere memoria mediante la eliminación de las claves con el menor TTL.


Una vez que haya implementado esta estrategia, asegúrese de probar su aplicación para descubrir el mejor valor para el TTL y la mejor estrategia de expulsión. Compruebe el rendimiento de su aplicación con una caché vacía y con una caché llena.