Skip to content

Latest commit

 

History

History
562 lines (396 loc) · 12.1 KB

09_redis.md

File metadata and controls

562 lines (396 loc) · 12.1 KB

Redis


<< PROYECTO | HOME





Instalar Redis en Mac

Para realizar la instalación de Redis en Mac, en primer lugar, instalaremos Hombrew desde su página principal a través de este comando:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Hecho esto, se habrá instalado y ya podremos proceder a instalar Redis con el siguiente comando:

brew install redis

Puede tomar unos minutos dependiendo del equipo de cada uno.





Primeros pasos

Ahora que se ha instalado Redis, comenzaremos escribiendo lo siguiente en la terminal:

redis-server

Se verá cierta información en la pantalla, lo que indicará que todo funciona correctamente.

En la última línea de la terminal, se podrá ver que el puerto es el 6379 (número situado al final de la última línea: The server is now ready to accept connections on port 6379).

Para comenzar un servidor Redis, se debe escribir lo siguiente:

redis-cli

Como resultado se obtiene lo siguiente:

127.0.0.1:6379>

Lo que significa que todo está funcionando y que podemos proseguir utilizando el servidor.





SET y GET

  • SET:

    • Sintaxis:
    SET key value [EX seconds] [PX milliseconds] [NX|XX]

    Si el parámetro está entre '[]', es opcional, sino, es obligatorio.

    • Ejemplo:
    127.0.0.1:6379> SET page_name 'About us'
    OK

    La primera línea representa lo que el usuario introduce en la terminal: SET key value.

    La segunda línea muestra lo que la terminal devuelve: OK, que todo ha salido correctamente.

  • GET:

    • Sintaxis:
    GET key
    • Ejemplos:
    # Ejemplo 1
    127.0.0.1:6379> GET wrong_key
    (nil)
    
    # Ejemplo 2
    127.0.0.1:6379> GET page_name
    "About us"

    En el primer ejemplo se intenta obtener el valor de una clave que no existe. Sin embargo, esto no es problema, puesto que cuando esto sucede, Redis simplemente devuelve un (nil).

    Finalmente, intentamos acceder a la clave correcta, lo que da como resultado el valor esperado.





Estructurar las claves

En SQL se suele disponer (o por lo menos es buena práctica hacerlo) de una variable de tipo ID, con un valor único para saber a qué elemento se está haciendo referencia.

En Redis, esto no ocurre. No existe un ID para los registros, sino que los datos se almacenan en pares clave-valor. Entonces, ¿cómo se puede saber a qué registro está haciendo referencia una clave?

Un truco muy habitual para solucionar esto suele ser escribir una especie de ID, seguido de un : y finalmente el nombre de la clave que se quiere usar. Por ejemplo:

127.0.0.1:6379> SET 105:guide_like_count 0
OK
127.0.0.1:6379> GET 105:guide_like_count
"0"

A lo largo del curso, solo usaremos esta práctica en casos necesarios por cuestiones de comodidad a la hora de escribir las claves.


De esta forma se podría conseguir saber a qué elemento se está haciendo referencia.





Incrementar y decrementar valores

Vamos a comenzar creando un post:

127.0.0.6379> SET post_like_count:42 0
OK
  • Incrementar valores:
# Incrementar de 1 en 1
127.0.0.6379> INCR post_like_count:42
(integer) 1
127.0.0.6379> INCR post_like_count:42
(integer) 2
127.0.0.6379> GET post_like_count:42
"2"

# Incrementar en cantidades concretas
127.0.0.6379> INCRBY post_like_count:42 100
(integer) 102
127.0.0.6379> GET post_like_count:42
"102"
  • Decrementar valores: funciona de la misma manera que las funciones INCR e INCRBY.
# Decrementar de 1 en 1
127.0.0.6379> DECR post_like_count:42
(integer) 101
127.0.0.6379> GET post_like_count:42
"101"

# Decrementar en cantidades concretas
127.0.0.6379> DECRBY post_like_count:42 21
(integer) 80




Eliminar ítems

Para eliminar ítems, se hace uso de la función DEL:

# Creamos varios ítems
127.0.0.6379> SET first_name "Jordan"
OK
127.0.0.6379> SET last_name "Hudgens"
OK
127.0.0.6379> SET middle_name "David"
OK

# Se pueden eliminar varios a la vez
127.0.0.6379> DEL first_name last_name
(integer) 2		# cuántos ítems se han eliminado
127.0.0.6379> GET first_name
(nil)			# si no encuentra algo, no da error, devuelve (nil)
127.0.0.6379> 




Comprobar si una clave existe

Técnicamente, se puede usar el comando GET para saber si una clave existe o no, sin embargo, ésta se considera una práctica pobre.

La mejor forma de comprobar si existe o no una clave, es hacer uso de EXISTS. Veámoslo con un ejemplo:

127.0.0.1:6379> SET title "My post"
OK
127.0.0.1:6379> EXISTS title
(integer) 1
127.0.0.1:6379> EXISTS a_key_that_has_not_been_created
(integer) 0
127.0.0.1:6379> GET a_key_that_has_not_been_created
(nil)

Puede que estés pensando: ¿por qué usar EXISTS y no un simple GET?

La respuesta es más sencilla de lo que parece. Si se usa EXISTS y el ítem existe, se recibe un 1, sin embargo, cuando éste no existe, se obtiene un 0. Estos valores pueden ser muy útiles para usarlos en condicionales. Sin embargo, usando GET, no se obtiene un valor que pueda usarse para comparar o para decidir si una condición se cumple o no.





Expirar una clave

En ocasiones, no se suele desear que una clave permanezca de por vida, por lo que se suele expirar.

Para poder expirar un ítem, se hace uso del comando EXPIRE, seguido del nombre de la clave y de la cantidad de segundos a esperar para que el ítem se expire. Vamos con un ejemplo:

# Inicializar una clave
127.0.0.1:6379> SET featured_image "somepicture.png"

# Indicar 21 segundos para que expire
127.0.0.1:6379> EXPIRE featured_image 21
(integer) 1

# Comprobar el tiempo restante para que expire
127.0.0.1:6379> TTL featured_image
(integer) 11	# quedan 11 segundos para que expire

# Comprobar si se puede acceder a su valor
127.0.0.1:6379> GET featured_image
"somepicture.png"
127.0.0.1:6379> TTL featured_image
(integer) 3

# Tras unos segundos:
127.0.0.1:6379> TTL featured_image
(integer) -2	# se mantendrá así siempre
127.0.0.1:6379> GET featured_image
(nil)			# ya se ha expirado




Sobrescribir el valor de una clave

Se pueden sobrescribir los valores de una clave simplemente usando SET de nuevo:

127.0.0.1:6379> SET current_batter "Altuve"
OK
127.0.0.1:6379> GET current_batter
"Altuve"
127.0.0.1:6379> SET current_batter "Correa"
OK
127.0.0.1:6379> GET current_batter
"Correa"

Sin embargo, se puede hacer lo siguiente:

# Siguiendo desde donde estábamos
127.0.0.1:6379> GETSET current_batter "Bregman"
"Correa"
127.0.0.1:6379> GET current_batter
"Bregman"

GETSET: Se obtiene el valor anterior y se inserta el nuevo.


Si se usa GETSET sobre un valor que no existía previamente, se obtiene el valor (nil), lo cual tiene sentido porque era una clave que no existía, por lo que el valor anterior al insertado era (nil).





Saber qué claves existen

En ocasiones, creemos que una clave existe y sin embargo, esto no es así. En esos casos, debemos comprobar la lista de claves que tenemos para saber si efectivamente esa clave existe o no.

Existen diferentes formas de saber qué claves tenemos disponibles en Redis, he aquí algunos ejemplos:

  • Obtener todas las claves:
127.0.0.1:6379> KEYS *
 1) "users:123"
 2) "post_like_count:42"
 3) "105:guide_like_count"
 4) "post_id"
 5) "105:post_like_count"
 6) "title"
 7) "asdfasadfasdf"
 8) "page_name"
 9) "current_batter"
10) "user:42"
11) "middle_name"

  • Obtener las claves que contengan una palabra concreta en ellas:
127.0.0.1:6379> KEYS *post*
1) "post_like_count:42"
2) "post_id"
3) "105:post_like_count"
127.0.0.1:6379> KEYS *user*
1) "user:123"
2) "user:42"

  • Más ejemplos de plantillas:
127.0.0.1:6379> SET myusername "jordan"
OK

# Que contenga la palabra 'user'
127.0.0.1:6379> KEYS *user*
1) "user:123"
2) "myusername"
3) "user:42"

# Que empiece por la palabra 'user'
127.0.0.1:6379> KEYS user*
1) "user:123"
2) "user:42"

# Que empiece por 'user' y tenga 4 chars más detrás
127.0.0.1:6379> KEYS user????
1) "user:123"




Usar Redis con HASHes

HASH: un tipo de dato con la estructura clave-valor que permite además almacenar colecciones de ítems.


Vamos a ver cómo usar HASHes para almacenar datos de una forma un poco diferente a la vista hasta ahora. Para poder crear nuevos ítems, usaremos el comando HSET, con la siguiente sintaxis:

HSET key field value

Y para obtener los valores, usaremos HGET siguiendo la siguiente sintaxis:

HGET key field

Vamos con un ejemplo:

# Creación de un HASH con los campos 'name' y 'email'
127.0.0.1:6379> HSET user:123 name "Kristine"
(integer) 1
127.0.0.1:6379> HSET user:123 email "kristine@devcamp.com"
(integer) 1

# Si se intenta obtener datos sin usar el campo, da error
127.0.0.1:6379> HGET user:123
(error) ERR wrong number of arguments for 'hget' command

# Ahora obtenemos datos introduciendo los campos
127.0.0.1:6379> HGET user:123 name
"Kristine"
127.0.0.1:6379> HGET user:123 email
"kristine@devcamp.com"

Como se puede observar, los HASH pueden resultar muy útiles porque permiten almacenar mucha información sobre algo concreto en una sola clave, generando varios campos para los atributos de la misma.




Comandos HASH

Vamos a ver unos pocos ejemplos de los comandos más comunes usados con HASH en Redis:

  • Crear múltiples campos en una sola línea:
127.0.0.1:6379> HMSET user:42 name "Darth" email "darth@vader.com"
OK
127.0.0.1:6379> HGET user:42 name
"Darth"

  • Obtener múltiples valores:
127.0.0.1:6379> HMGET user:42 name email
1) "Darth"
2) "darth@vader.com"

Se devuelve un array con los valores de los campos que se quieren obtener.


  • Obtener todo lo que esté dentro de una clave:
127.0.0.1:6379> HGETALL user:42
1) "name"
2) "Darth"
3) "email"
4) "darth@vader.com"

Devuelve una lista donde los números (índices) impares representan el nombre del campo y los pares son el valor correspondiente al campo.


  • Obtener los campos de una clave:
127.0.0.1:6379> HKEYS user:42
1) "name"
2) "email"

  • Comprobar si un campo existe dentro de una clave:
127.0.0.1:6379> HEXISTS user:42 email
(integer) 1
127.0.0.1:6379> HEXISTS user:42 altemail
(integer) 0

  • Crear / Añadir un nuevo campo para una clave:
127.0.0.1:6379> HSET user:42 id 1
(integer) 1
127.0.0.1:6379> HGETALL user:42
1) "name"
2) "Darth"
3) "email"
4) "darth@vader.com"
5) "id"
6) "1"

  • Incrementar / Decrementar un valor:
127.0.0.1:6379> HINCRBY user:42 id 123
(integer) 124
127.0.0.1:6379> HGETALL user:42
1) "name"
2) "Darth"
3) "email"
4) "darth@vader.com"
5) "id"
6) "124"

Existen los equivalentes de:

  • INCR
  • INCRBY
  • DECR
  • DECRBY

Para los HASH, solo se debe añadir una H delante de los comandos.


  • Eliminar un campo de una clave:
127.0.0.1:6379> HDEL user:42 id
(integer) 1
127.0.0.1:6379> HGETALL user:42
1) "name"
2) "Darth"
3) "email"
4) "darth@vader.com"

  • Obtener la cantidad de campos que tiene una clave:
127.0.0.1:6379> HLEN user:42
(integer) 2